剑指Offer题解——数学

女爷i 2022-11-25 10:28 273阅读 0赞

文章目录

    • 剑指 Offer 17. 打印从1到最大的n位数
      • 回溯解法
    • 剑指 Offer 20. 表示数值的字符串
      • 解法
    • 剑指 Offer 43. 1~n整数中1出现的次数
      • 解法
    • 剑指 Offer 44. 数字序列中某一位的数字
      • 解法
    • 剑指 Offer 49. 丑数
      • 解法
        • 推荐阅读

剑指 Offer 17. 打印从1到最大的n位数

剑指 Offer 17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

  1. 示例 1:
  2. 输入: n = 1
  3. 输出: [1,2,3,4,5,6,7,8,9]
  4. 说明:
  5. 用返回一个整数列表来代替打印
  6. n 为正整数

回溯解法

此题应该主要考察大数越界的情况,详解见leetcode

  1. class Solution {
  2. int[] res;
  3. int nine = 0, count = 0, start, n;
  4. char[] num, loop = {
  5. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
  6. public int[] printNumbers(int n) {
  7. this.n = n;
  8. res = new int[(int)Math.pow(10, n) - 1];
  9. num = new char[n];
  10. start = n - 1;
  11. dfs(0);
  12. return res;
  13. }
  14. void dfs(int x) {
  15. if (x == n) {
  16. String s = String.valueOf(num).substring(start);
  17. if (!s.equals("0")) {
  18. res[count++] = Integer.parseInt(s);
  19. }
  20. if (n - start == nine) {
  21. start--;
  22. }
  23. return;
  24. }
  25. for (char i : loop) {
  26. if (i == '9') {
  27. nine++;
  28. }
  29. num[x] = i;
  30. dfs(x + 1);
  31. }
  32. nine--;
  33. }
  34. }

剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”、“5e2”、”-123”、“3.1416”、“0123”都表示数值,但”12e”、“1a3.14”、“1.2.3”、“±5”、”-1E-16”及”12e+5.4”都不是。

解法

  1. class Solution {
  2. public boolean isNumber(String s) {
  3. if (s == null || s.length() == 0) {
  4. return false;
  5. }
  6. // 标记是否遇到数位、小数点、‘e’或'E'
  7. boolean numFlag = false, dotFlag = false, eFlag = false;
  8. char[] str = s.trim().toCharArray();
  9. for (int i = 0; i < str.length; i++) {
  10. if (str[i] >= '0' && str[i] <= '9') {
  11. numFlag = true;
  12. } else if (str[i] == '.') {
  13. // 小数点之前可以没有整数,但是不能重复出现小数点、或出现‘e’、'E'
  14. if (eFlag || dotFlag) {
  15. return false;
  16. }
  17. dotFlag = true;
  18. } else if (str[i] == 'e' || str[i] == 'E') {
  19. if (!numFlag || eFlag) {
  20. return false;
  21. }
  22. eFlag = true;
  23. // 重置numFlag,因为‘e’或'E'之后也必须接上整数,防止出现 123e或者123e+的非法情况
  24. numFlag = false;
  25. } else if (str[i] == '-' || str[i] == '+') {
  26. // 正负号只可能出现在第一个位置,或者出现在‘e’或'E'的后面一个位置
  27. if (i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') {
  28. return false;
  29. }
  30. } else {
  31. return false;
  32. }
  33. }
  34. return numFlag;
  35. }
  36. }

剑指 Offer 43. 1~n整数中1出现的次数

剑指 Offer 43. 1~n整数中1出现的次数

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

  1. 示例 1
  2. 输入:n = 12
  3. 输出:5
  4. 示例 2
  5. 输入:n = 13
  6. 输出:6
  7. 限制:
  8. 1 <= n < 2^31

解法

详解见leetcode

  1. class Solution {
  2. public int countDigitOne(int n) {
  3. int digit = 1, res = 0;
  4. int high = n / 10, cur = n % 10, low = 0;
  5. while (high != 0 || cur != 0) {
  6. if (cur == 0) {
  7. res += high * digit;
  8. }
  9. else if (cur == 1) {
  10. res += high * digit + low + 1;
  11. }
  12. else {
  13. res += (high + 1) * digit;
  14. }
  15. low += cur * digit;
  16. cur = high % 10;
  17. high /= 10;
  18. digit *= 10;
  19. }
  20. return res;
  21. }
  22. }

剑指 Offer 44. 数字序列中某一位的数字

剑指 Offer 44. 数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

  1. 示例 1
  2. 输入:n = 3
  3. 输出:3
  4. 示例 2
  5. 输入:n = 11
  6. 输出:0
  7. 限制:
  8. 0 <= n < 2^31

解法

  1. class Solution {
  2. public int findNthDigit(int n) {
  3. int digit = 1;
  4. long start = 1;
  5. long count = 9;
  6. while (n > count) {
  7. // 1.
  8. n -= count;
  9. digit += 1;
  10. start *= 10;
  11. count = digit * start * 9;
  12. }
  13. long num = start + (n - 1) / digit; // 2.
  14. return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
  15. }
  16. }

剑指 Offer 49. 丑数

剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

  1. 示例:
  2. 输入: n = 10
  3. 输出: 12
  4. 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
  5. 说明:
  6. 1 是丑数。
  7. n 不超过1690

解法

  1. class Solution {
  2. public int nthUglyNumber(int n) {
  3. int a = 0, b = 0, c = 0;
  4. int[] dp = new int[n];
  5. dp[0] = 1;
  6. for (int i = 1; i < n; i++) {
  7. int n2 = dp[a] * 2, n3 = dp[b] * 3, n4 = dp[c] * 5;
  8. dp[i] = Math.min(n2, Math.min(n3, n4));
  9. if(dp[i] == n2) a++;
  10. if(dp[i] == n3) b++;
  11. if(dp[i] == n4) c++;
  12. }
  13. return dp[n - 1];
  14. }
  15. }

推荐阅读

  • 机器学习资料汇总
  • 吴恩达《机器学习》视频、作业、源码
  • 106页《Python进阶》中文版正式发布
  • 李航《统计学习方法》第二版完整课件
  • 机器学习数学全书,1900页PDF下载

format_png

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 offer题解【全】

    最近把之前刷过的剑指offer题目总结一下,先列举一部分,待更新…… [剑指 Offer 03. 数组中重复的数字][Offer 03.] 题意: > 找出数组中重复