当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

解法

此题需要注意 n 位数构成的数字可能超出最大的 int 或者 long long 能表示的范围。因此,采用字符数组来存储数字。

关键是:

  • 对字符数组表示的数进行递增操作
  • 输出数字(0开头的需要把0去除)
  1. /**
  2. * @author bingo
  3. * @since 2018/11/20
  4. */
  5. public class Solution {
  6. /**
  7. * 打印从1到最大的n位数
  8. * @param n n位
  9. */
  10. public void print1ToMaxOfNDigits(int n) {
  11. if (n < 1) {
  12. return;
  13. }
  14. char[] chars = new char[n];
  15. for (int i = 0; i < n; ++i) {
  16. chars[i] = '0';
  17. }
  18. while (!increment(chars)) {
  19. printNumber(chars);
  20. }
  21. }
  22. /**
  23. * 打印数字(去除前面的0)
  24. * @param chars 数字数组
  25. */
  26. private void printNumber(char[] chars) {
  27. int index = 0;
  28. int n = chars.length;
  29. for (char ch : chars) {
  30. if (ch != '0') {
  31. break;
  32. }
  33. ++index;
  34. }
  35. StringBuilder sb = new StringBuilder();
  36. for (int i = index; i < n; ++i) {
  37. sb.append(chars[i]);
  38. }
  39. System.out.println(sb.toString());
  40. }
  41. /**
  42. * 数字加1
  43. * @param chars 数字数组
  44. * @return 是否溢出
  45. */
  46. private boolean increment(char[] chars) {
  47. boolean flag = false;
  48. int n = chars.length;
  49. int carry = 1;
  50. for (int i = n - 1; i >= 0; --i) {
  51. int num = chars[i] - '0' + carry;
  52. if (num > 9) {
  53. if (i == 0) {
  54. flag = true;
  55. break;
  56. }
  57. chars[i] = '0';
  58. } else {
  59. ++chars[i];
  60. break;
  61. }
  62. }
  63. return flag;
  64. }
  65. }

测试用例

  1. 功能测试(输入 1、2、3……);
  2. 特殊输入测试(输入 -1、0)。

该分类下的相关小册推荐: