From 0dfaf19cf9daf6a3c721d1a5716f77ca56468c34 Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Sat, 24 May 2025 09:25:57 +0800 Subject: [PATCH] =?UTF-8?q?5.24=20=E6=95=B0=E5=AD=97=E3=80=81=E6=8A=80?= =?UTF-8?q?=E5=B7=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/digit/MyPow.java | 40 +++++++++++++++++++++ src/main/java/digit/MySqrt.java | 37 +++++++++++++++++++ src/main/java/digit/PlusOne.java | 28 +++++++++++++++ src/main/java/digit/TrailingZeroes.java | 27 ++++++++++++++ src/test/java/digit/TrailingZeroesTest.java | 15 ++++++++ 5 files changed, 147 insertions(+) create mode 100644 src/main/java/digit/MyPow.java create mode 100644 src/main/java/digit/MySqrt.java create mode 100644 src/main/java/digit/PlusOne.java create mode 100644 src/main/java/digit/TrailingZeroes.java create mode 100644 src/test/java/digit/TrailingZeroesTest.java diff --git a/src/main/java/digit/MyPow.java b/src/main/java/digit/MyPow.java new file mode 100644 index 0000000..041ae13 --- /dev/null +++ b/src/main/java/digit/MyPow.java @@ -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; + } +} diff --git a/src/main/java/digit/MySqrt.java b/src/main/java/digit/MySqrt.java new file mode 100644 index 0000000..764fefc --- /dev/null +++ b/src/main/java/digit/MySqrt.java @@ -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; + } +} diff --git a/src/main/java/digit/PlusOne.java b/src/main/java/digit/PlusOne.java new file mode 100644 index 0000000..294ae31 --- /dev/null +++ b/src/main/java/digit/PlusOne.java @@ -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; + } +} diff --git a/src/main/java/digit/TrailingZeroes.java b/src/main/java/digit/TrailingZeroes.java new file mode 100644 index 0000000..f5b8d63 --- /dev/null +++ b/src/main/java/digit/TrailingZeroes.java @@ -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; + } +} diff --git a/src/test/java/digit/TrailingZeroesTest.java b/src/test/java/digit/TrailingZeroesTest.java new file mode 100644 index 0000000..ea394b1 --- /dev/null +++ b/src/test/java/digit/TrailingZeroesTest.java @@ -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); + } +} \ No newline at end of file