LeetCodeHot100-第三章:数学
面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
目录
🎈1、双指针:9. 回文数
🎈2、逻辑题 :66. 加一
🎈3、逻辑题:172. 阶乘后的零
🎈4、二分模板:69. x 的平方根
🎈5、位运算:50. Pow(x, n)
🎈6、暴力模拟:149. 直线上最多的点数
🎈1、双指针:9. 回文数
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。示例 1:
输入:x = 121 输出:true示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。进阶:你能不将整数转为字符串来解决这个问题吗?
class Solution {
public boolean isPalindrome(int x) {
String s = Integer.toString(x);
char[] arr=s.toCharArray();
int left=0;
int right=arr.length-1;
while(left<right){
if(arr[left]!=arr[right]){
return false;
}
left++;
right--;
}
return true;
}
}
🎈2、逻辑题 :66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。示例 3:
输入:digits = [9] 输出:[1,0] 解释:输入数组表示数字 9。 加 1 得到了 9 + 1 = 10。 因此,结果应该是 [1,0]。提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
class Solution {
public int[] plusOne(int[] digits) {
for(int i = digits.length - 1; i >= 0; i--){
digits[i] = digits[i] + 1;
if(digits[i] == 10){
//当前值置0,下一位数字继续叠加
digits[i] = 0;
}else{
return digits;
}
}
//没有return只有可能是当前的值为99999.....,的情况,只需要new一个比原来数组大1的就可以.且把第一个元素置1,后面全0
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}
🎈3、逻辑题:172. 阶乘后的零
给定一个整数
n
,返回n!
结果中尾随零的数量。提示
n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
示例 1:
输入:n = 3 输出:0 解释:3! = 6 ,不含尾随 0示例 2:
输入:n = 5 输出:1 解释:5! = 120 ,有一个尾随 0示例 3:
输入:n = 0 输出:0进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
class Solution {
public int trailingZeroes(int n) {
int ans=0;
//0的个数取决于5的数量
while (n!=0){
ans+=n/5;
n/=5;
}
return ans;
}
}
🎈4、二分模板:69. x 的平方根
给你一个非负整数
x
,计算并返回x
的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如
pow(x, 0.5)
或者x ** 0.5
。示例 1:
输入:x = 4 输出:2示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
class Solution {
public int mySqrt(int x) {
int l=0,r=x,ans=-1;
while(l<=r){
int mid=(l+r)/2;
// 之前写的CSDN二分模板:
// https://blog.csdn.net/m0_55858611/article/details/128910634?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522f0b874fdc6ea87b7d3fe64ae017dde2a%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=f0b874fdc6ea87b7d3fe64ae017dde2a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-128910634-null-null.nonecase&utm_term=%E4%BA%8C%E5%88%86&spm=1018.2226.3001.4450
/**
* //二分查找最优边长
* while (l <= r) {
* //mid为边长
* mid = (l + r) / 2;
* if (check(mid)) {
* //ans是用来记录count=K时的mid的
* ans = mid;
* l = mid + 1;
* } else {
* r = mid - 1;
* }
* }
* System.out.println(ans);
*/
if((long)mid*mid<=x){
ans=mid;
l=mid+1;
}else {
r=mid-1;
}
}
return ans;
}
}
🎈5、位运算:50. Pow(x, n)
实现 pow(x, n) ,即计算
x
的整数n
次幂函数(即,xn
)。示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000示例 2:
输入:x = 2.10000, n = 3 输出:9.26100示例 3:
输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25
class Solution {
public double myPow(double x, int n) {
//灵神题解
// https://leetcode.cn/problems/powx-n/solutions/2858114/tu-jie-yi-zhang-tu-miao-dong-kuai-su-mi-ykp3i/?envType=study-plan-v2&envId=top-interview-150
double ans=1;
long N=n;
if(N<0){
N=-N;
x=1/x;
}
while(N>0){
if((N&1)==1){
ans*=x;
}
x*=x;
N>>=1;
}
return ans;
}
}
🎈6、暴力模拟:149. 直线上最多的点数
class Solution {
//暴力模拟
//1 <= points.length <= 300题目给的数据量有限的情况下
public int maxPoints(int[][] points) {
int length=points.length;
if(length<=2)return length;
int ans=0;
for(int i=0;i<length;i++){
for(int j=0;j<i;j++){
int x1=points[i][0];
int y1=points[i][1];
int x2=points[j][0];
int y2=points[j][1];
int temp=2;
for(int k=0;k<j;k++){
int x3=points[k][0];
int y3=points[k][1];
if((y3-y2)*(x2-x1)==(y2-y1)*(x3-x2)){
temp++;
}
}
ans=Math.max(ans,temp);
}
}
return ans;
}
}