5.24 数字、技巧
This commit is contained in:
parent
0760f5b78c
commit
0dfaf19cf9
40
src/main/java/digit/MyPow.java
Normal file
40
src/main/java/digit/MyPow.java
Normal 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;
|
||||
}
|
||||
}
|
37
src/main/java/digit/MySqrt.java
Normal file
37
src/main/java/digit/MySqrt.java
Normal 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;
|
||||
}
|
||||
}
|
28
src/main/java/digit/PlusOne.java
Normal file
28
src/main/java/digit/PlusOne.java
Normal 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;
|
||||
}
|
||||
}
|
27
src/main/java/digit/TrailingZeroes.java
Normal file
27
src/main/java/digit/TrailingZeroes.java
Normal 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/(5∗5)+n/(5∗5∗5)+...
|
||||
public int trailingZeroes(int n) {
|
||||
int count = 0;
|
||||
// 每次除以 5,累加能贡献一个额外 5 的数目
|
||||
while (n > 0) {
|
||||
n /= 5;
|
||||
count += n;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
15
src/test/java/digit/TrailingZeroesTest.java
Normal file
15
src/test/java/digit/TrailingZeroesTest.java
Normal 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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user