第四天了
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变为100,999变为1000。Flag首先设置为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类倒是知道,但确实没有意识用在这里或者说压根不知道他该用在哪里。
也是没想到看上去很简单的一道题,做了我这么久- -