• leetcode——66.加一


    经过一早上的两个多小时才完成,,,

    代码如下:

     1 class Solution:
     2     def plusOne(self, digits):
     3         index=[]
     4         for i in range(len(digits)):
     5             if digits[i]==9:
     6                 index.append(i)
     7         
     8         if len(index)==len(digits):
     9             digits[:]=(0,)*(len(digits)+1)
    10             digits[0]=1
    11         else:
    12             a=[i for i in range(len(digits))]
    13             ret=[]
    14             for i in a:  #差集
    15                 if i not in index:
    16                     ret.append(i)
    17             
    18             b=ret[-1]
    19             digits[b]+=1
    20             digits[b+1:]=(0,)*(len(digits)-b-1)
    21         return digits
    22         
    23         
    24 a=Solution()    
    25 digits=[1,2,3]
    26 print(a.plusOne(digits))

    具体思路就是:

    现将digits中9的索引找出来保存在列表index中;

    a是digits所有元素索引构成的列表;

    求index和a的差集ret;

    求ret中最大的数,就是digits中从右到左第一个不是9的项数的索引,将它自身加一,它后面的项都设置为0;

    如果index的长度和digits的长度相等,说明digits中的数字都是9,将第一个数设置为1,末尾添加一个0,,,,,,

    就这样。

    digits[:]=(0,)*(len(digits)+1)

    将digits设置为长度是len(digits)+1的全0列表。

    我不知道为什么非得这样乘,不然它就只显示一个0,,这个写法是试出来的。

    第一次用到了(0,)这样的用法,还是挺开心的。

    之前还实现了一次,但是显示超出时间了,就算了,不在这里放了。

    @@@@@@@@@@@                                                 ——2019.9.18


    完成

    public int[] plusOne(int[] digits) {
            int len = digits.length;
            if(len == 0){
                return new int[]{1};
            }
            if(digits[len - 1] < 9){
                digits[len - 1] ++;
                return digits;
            }
            //设置进位
            int c = 0;
            //设置数组存储结果
            ArrayList<Integer> list = new ArrayList<>();
            //从后往前遍历
            int i = len -2;
            list.add(0);
            c = 1;
            while(i>=0){
                //满10进1,否则,将其他数字全部挪一遍
                list.add(0,(c+digits[i])%10);
                c = (c+digits[i])/10;
                i++;
            }
            if(c == 1) {
                list.add(0, 1);
            }
            return list.stream().mapToInt(Integer::valueOf).toArray();
        }

    但是效率好差。

    看看别人简洁明了的答案:

    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;
        }

    ——2020.7.10

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    PHP_Code_challenge(代码审计)
    超全局变量$GLOBALS
    upload-labs(文件上传)
    CTF bugku 论剑场 web20
    多次Printf()是否使用用同一栈帧的参数?
    (转载于度盘)小迪安全渗透-学习讲义
    SQL数据库操作练习(2)
    .htaccess绕过
    PHP序列化思考(9.14已修改)
    SQL数据库操作练习(1)
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11542295.html
Copyright © 2020-2023  润新知