第四天了

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

 

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

 

你可以假设除了整数 0 之外,这个整数不会以零开头。

 

 

 

示例 1

 

输入:digits = [1,2,3]

输出:[1,2,4]

解释:输入数组表示数字 123

 

来源:力扣(LeetCode

链接:https://leetcode-cn.com/problems/plus-one

 

难倒是不难,就是要考虑的情况一一考虑到就可以了。做的时候就漏掉了几个。

思路如下:

遍历数组,设置两个变量,flag为进位,a为其中为9的个数,因为只加1,所以如果有需要加一位的话只有数组中全是9的情况,比如99变为100999变为1000Flag首先设置为1,题干要求加一等同于后面一位进一情况。每个成员加上flag后进入判断,若等于10则将flag设为1,自己设为0,若不为10则说明没有进位,flag设置为0。最后判断9的个数是否等于数组长度,若等于则返回一个10...的数组,不等于则返回原数组即可。

总体来说思路比较朴素,做法也比较朴素。。

代码:

class Solution {

    public int[] plusOne(int[] digits) {

        int a=0;

        int flag=1;

        for(int i=digits.length-1;i>=0;i--){

            if(digits[i]==9){a++;}

            digits[i]=digits[i]+flag;

            if(digits[i]==10){

                flag=1;

                digits[i]=0;

            }else{

                flag=0;

            }

        }

        if(a==digits.length){

            int[] ans=new int[digits.length+1];

            Arrays.fill(ans,0);

            ans[0]=1;

            return ans;

        }else{

            return digits;

        }

        

    }

}

 

 

 

67. 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

 

输入为 非空 字符串且只包含数字 1  0

 

 

 

示例 1:

 

输入: a = "11", b = "1"

输出: "100"

 

来源:力扣(LeetCode

链接:https://leetcode-cn.com/problems/add-binary

 

java折磨了一百万年,就一直记得有个函数可以直接把数字转为二进制的表示形式来着,结果最后想起来是在python里的,切成python一做,一行就写完了- -

class Solution:

    def addBinary(self, a: str, b: str) -> str:

        return bin(int(a,2)+int(b,2))[2:]

确实是有点子无语在里面了,但是java的还得做呀,于是又开始攻坚克难。

字符没法相加,数字没法遍历。在这两个主要问题下,我选择解决后者,用了最原始的%10/10结合遍历数字写出如下代码:

class Solution {

    public String addBinary(String a, String b) {

        if(a.equals("0")) return b;

        if(b.equals("0")) return a;

        int a1=Integer.parseInt(a);

        int b1=Integer.parseInt(b);

        int c1=a1+b1;

        String c=String.valueOf(c1);

        int flag=0;

        String ans="";

        while(c1!=0){

            c1=c1+flag;

            int tmp=c1%10;

            c1=c1/10;

            if(tmp==2&&c1==0){

                flag=1;

                ans="10"+ans;

            }else if(tmp==2&&c1!=0){

                flag=1;

                ans="0"+ans;

            }else if(tmp==3&&c1!=0){

                flag=1;

                ans="1"+ans;

            }else if(tmp==3&&c1==0){

                flag=1;

                ans="11"+ans;

            }else{

                flag=0;

                ans=String.valueOf(tmp)+ans;

            }

        }

        return ans;

    }

}

意外的好用,但是,很遗憾的是int它并不够大,当遇到"1110110101" "1110111011",这个案例时,输出了非常神奇的东西,"-20-7-4-7-4-6-1-8-4",换成flaot后并没有变好,甚至看起来更糟了"-2.00.0-7.0-4.0-7.0-4.0-6.0-1.0-8.0-4.0",给我气笑了。看了以后发现原来是换成float以后变成了科学计数法2.22022093E9 - -。网上查到了怎么让大数字不转化为科学计数法。

BigDecimal c1 = new BigDecimal(c2);

但是,力扣好像并不吃这一套,找不到BigDecimal这个类。至此,我真的累了,我认输了。

通过测试用例:193 / 294,通过的这193个案例,也算见证了我的努力了。。。

正确代码如下:

class Solution {

    public String addBinary(String a, String b) {

        StringBuilder sb = new StringBuilder();

        int ai = a.length() - 1, bi = b.length() - 1;

        int carry = 0;

        while (ai >= 0 || bi >= 0 || carry != 0) {

            int ca = ai >= 0 ? a.charAt(ai--) - '0' : 0;

            int cb = bi >= 0 ? b.charAt(bi--) - '0' : 0;

            int sum = ca + cb + carry;

            carry = sum / 2;

            sb.append(sum % 2);

        }

        return sb.reverse().toString();

    }

}

 

只能说。论掌握多门语言的重要性(不是。

StringBuilder类倒是知道,但确实没有意识用在这里或者说压根不知道他该用在哪里。

也是没想到看上去很简单的一道题,做了我这么久- -

posted @ 2022-03-18 01:00  水煮小白菜  阅读(65)  评论(0编辑  收藏  举报