5.24 数字、技巧

This commit is contained in:
zhangsan 2025-05-24 09:25:57 +08:00
parent 0760f5b78c
commit 0dfaf19cf9
5 changed files with 147 additions and 0 deletions

View File

@ -0,0 +1,40 @@
package digit;
/**
* 题目 50. Pow(x, n) (myPow)
* 描述实现 pow(x, n) 即计算 x 的整数 n 次幂函数xn
*
示例 1
输入x = 2.00000, n = 10
输出1024.00000
* 链接https://leetcode.cn/problems/powx-n/
*/
//自己写的超时
public class MyPow {
public double myPow(double x, int n) {
// 0^任何正数 = 0 任何数^0 = 1
if (x == 0) return 0;
if (n == 0) return 1;
// n 放到 long 避免 Integer.MIN_VALUE 取绝对值时溢出
long N = n;
if (N < 0) {
x = 1 / x; // 负指数取倒数
N = -N;
}
double ans = 1.0;
// 快速幂核心二分法分解 N
while (N > 0) {
// 如果当前最低位是 1就把当前 x 累乘进结果
if ((N & 1) == 1) {
ans *= x;
}
// x 翻倍x = x^2, x^4, x^8, ...
x *= x;
// 指数右移下一位变成最低位
N >>= 1;
}
return ans;
}
}

View File

@ -0,0 +1,37 @@
package digit;
/**
* 题目 69. x 的平方根 (mySqrt)
* 描述给你一个非负整数 x 计算并返回 x 算术平方根
* 由于返回类型是整数结果只保留 整数部分 小数部分将被 舍去
* 注意不允许使用任何内置指数函数和算符例如 pow(x, 0.5) 或者 x ** 0.5
*
示例 1
输入x = 4
输出2
* 链接https://leetcode.cn/problems/sqrtx/
*/
//不会
public class MySqrt {
/**
* 二分查找
* 由于 x 平方根的整数部分 ans 是满足 k^2 x 的最大 k 因此我们可以对 k 进行二分查找从而得到答案
* 二分查找的下界为 0上界可以粗略地设定为 x在二分查找的每一步中我们只需要比较中间元素 mid 的平方与 x 的大小关系并通过比较的结果调整上下界的范围由于我们所有的运算都是整数运算不会存在误差因此在得到最终的答案 ans 也就不需要再去尝试 ans+1
* @param x
* @return
*/
public int mySqrt(int x) {
int l = 0, r = x, ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if ((long) mid * mid <= x) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return ans;
}
}

View File

@ -0,0 +1,28 @@
package digit;
/**
* 题目 66. 加一 (plusOne)
* 描述给定一个由 整数 组成的 非空 数组所表示的非负整数在该数的基础上加一
*
* 最高位数字存放在数组的首位 数组中每个元素只存储单个数字
*
* 你可以假设除了整数 0 之外这个整数不会以零开头
*
示例 1
输入digits = [1,2,3]
输出[1,2,4]
解释输入数组表示数字 123
* 链接https://leetcode.cn/problems/plus-one/
*/
public class PlusOne {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
if (digits[i] != 0) return digits;
}
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}

View File

@ -0,0 +1,27 @@
package digit;
/**
* 题目 172. 阶乘后的零 (trailingZeroes)
* 描述给定一个整数 n 返回 n! 结果中尾随零的数量
*
* 提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
*
示例 1
输入n = 3
输出0
解释3! = 6 不含尾随 0
* 链接https://leetcode.cn/problems/factorial-trailing-zeroes/
*/
//先求阶乘会导致整数溢出20! 就已经无法放进 64 位整数
public class TrailingZeroes {
//正确做法统计因子5出现的次数n/5+n/(55)+n/(555)+...
public int trailingZeroes(int n) {
int count = 0;
// 每次除以 5累加能贡献一个额外 5 的数目
while (n > 0) {
n /= 5;
count += n;
}
return count;
}
}

View File

@ -0,0 +1,15 @@
package digit;
import org.junit.Test;
import static org.junit.Assert.*;
public class TrailingZeroesTest {
@Test
public void trailingZeroes() {
int n=13;
TrailingZeroes solution = new TrailingZeroes();
solution.trailingZeroes(n);
}
}