• 【LeetCode】【剑指offer】【打印从1到最大的n位数】


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

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

    示例 1:

    输入: n = 1
    输出: [1,2,3,4,5,6,7,8,9]
     

    说明:

    用返回一个整数列表来代替打印
    n 为正整数

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     

    1. class Solution {
    2. public:
    3. vector<int> printNumbers(int n) {
    4. int count=pow(10,n);
    5. vector<int> res;
    6. for(int i=1;i
    7. {
    8. res.push_back(i);
    9. }
    10. return res;
    11. }
    12. };

    上面这种做法就能够通过测试

    但是看了一下评论,好像《剑指offer》原本想考察的是大数相加的版本。但是大数相加返回的是string类型的,在leetcode上跑不过,我只在本地的IDE上实现了一下。

    1. class Solution {
    2. public:
    3. vector printNumbers(int n) {
    4. long count=pow(10,n);
    5. vector res;
    6. string num1="0";
    7. string num2="1";
    8. for(int i=1;i
    9. {
    10. res.push_back(addStrings(num1,num2));
    11. num1= addStrings(num1,num2);
    12. }
    13. return res;
    14. }
    15. public:
    16. string addStrings(string num1, string num2) {
    17. int end1=num1.size()-1,end2=num2.size()-1;
    18. int next=0;
    19. string strRet;
    20. while(end1>=0 || end2>=0)
    21. {
    22. int val1=end1>=0 ?num1[end1]-'0' :0;
    23. int val2=end2>=0 ?num2[end2]-'0' :0;
    24. int ret=val1+val2+next;
    25. next=ret>9 ? 1:0;
    26. //尾插
    27. strRet+=('0'+ ret%10);
    28. --end1;
    29. --end2;
    30. }
    31. //如果next还有进位就需要再尾插1
    32. if(next==1)
    33. {
    34. strRet+='1';
    35. }
    36. //逆置
    37. reverse(strRet.begin(),strRet.end());
    38. return strRet;
    39. }
    40. };
    41. int main()
    42. {
    43. Solution s1;
    44. vector string1=s1.printNumbers(5);
    45. for(auto s:string1)
    46. {
    47. cout<
    48. }
    49. }

    但是上面那种算法还是不行,对于大数运算的话count可能会装不下,所以我们最好的形式还是使用一位位确定的形式也就是说先将只有一个数位的数据确定了,再确定具有两个数据的数位,最后直到我们数据的数位等于我们要求的数位才结束循环。

    1. class Solution {
    2. public:
    3. vector printNumbers(int n) {
    4. for(int i=1;i<=n;i++)
    5. {
    6. create(0,i);
    7. }
    8. return res;
    9. }
    10. //生成长度为len的数字,长度是从1开始的,正在确定第pos位
    11. //这里的pos位是从0开始的。
    12. void create(int pos,int len)
    13. {
    14. //这里我们从上面的分析中得知
    15. //len的长度是从1开始的,pos的位置是从0开始的,
    16. //所以pos==len的时候其实就已经全部确定完成了,就可以插入到我们的容器中
    17. //并且返回了。
    18. if(pos==len)
    19. {
    20. res.push_back(cur);
    21. return;
    22. }
    23. //为了防止高位出现0的情况,我们需要判断当前的处理位置
    24. //注意由于是字符串所以下标为0,其实是真实数据的最高位
    25. //也就是说如果我们当前处理的是最高位,就需要从1开始遍历,而不是0
    26. int start=(pos==0? 1:0);
    27. for(int i=start ;i<10;i++)
    28. {
    29. cur.push_back(numbers[i]);
    30. //递归调用,处理下一位的数字
    31. create(pos+1,len);
    32. //删除我们当前位的数字,
    33. //比方说我们当前是12,这一次在后面插入3得到123
    34. //但是下一次遍历的时候我们需要将3删除,然后再将4拼接上去
    35. //得到下一个结果124。
    36. cur.pop_back();
    37. }
    38. }
    39. private:
    40. vector res;
    41. string cur;
    42. string numbers="0123456789";
    43. };
    44. int main()
    45. {
    46. Solution s1;
    47. vector string1=s1.printNumbers(2);
    48. for(auto s:string1)
    49. {
    50. cout<
    51. }
    52. }

  • 相关阅读:
    【Java并发入门】01 并发编程Bug的源头
    智云通CRM:报完价后客户没音讯了,该怎么办?
    12-资源注解annotations和安全行下文securityContext(了解即可)
    AI实战 | 由浅入深,手把手带你实现Java转型学习助手
    C++(string类)
    XC5013 马达驱动和充电集成一体的控制芯片 一档输出芯片
    三十四、Java Iterator(迭代器)
    vue-cli项目因为webpack版本不兼容运行后报错
    华企盾的面试流程,华企盾招聘流程
    el-date-picker日期选择器奇怪的问题解决
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126328758