链接:https://www.nowcoder.com/questionTerminal/c5649746e03140978f347bbb72282ad1
来源:牛客网
输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。
字符串长度不超过100。
示例1
输入
"1101","1100"
输出
"11001"
示例2
输入
"110101","1010110"
输出
"10001011"
思路:
- 取出较长的字符串用于遍历
let str = str1;//较长的字符串 let strElse = str2;//较短的字符串 if(str1.length < str2.length){ str = str2; strElse = str1; }
- 倒着取数,即从个位数开始取,有俩个临界点:短字符串的最高位和长的字符串的最高位
for(let i = 1; i <= str.length; i++){//在较长字符长度范围内执行 if(strElse.length >= i){//在较短字符长度范围内执行 //俩个字符串都有位值 }else{ //只有较长的字符串有位值 } }
- 每位值的数据获取:
str.substr(-i, 1)
- 每位值得数据处理:二进制满2进1,需要设置一个
addNum
来记录当前位是否需要进值,以及用now
记录进制后当前位的值
比如当前位temp为2,进一,下一位addNum为1,当前进制后的值now就为0
addNum = Math.floor(temp/2);//计算要加到下一位的数 let now = temp%2;//计算当前位值
- 每位位值的相加结果:除了要判断是否俩个值都有位值要相加之外,还要加上上一个位值进的值
addNum
//默认只加长的位值 let temp:number = Number(str.substr(-i, 1)) + addNum; if(strElse.length >= i){//在较短字符长度范围内执行 temp = Number(str.substr(-i, 1)) + Number(strElse.substr(-i, 1)) + addNum; }
- 循环结束后判断是否还有进制值
address
没加:if(addNum){ result = `${addNum}${result}` }
代码:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* public String solve (String str1, String str1)
* @param str1 string字符串
* @param str2 string字符串
* @return string字符串
*/
export function solve(str1: string, str2: string): string {
// write code here
let result:string = '';
let str = str1;//较长的字符串
let strElse = str2;//较短的字符串
if(str1.length < str2.length){
str = str2;
strElse = str1;
}
let addNum:number = 0;//加到下一位的数
for(let i = 1; i <= str.length; i++){
let temp:number = Number(str.substr(-i, 1)) + addNum;
if(strElse.length >= i){//在较短字符长度范围内执行
temp = Number(str.substr(-i, 1)) + Number(strElse.substr(-i, 1)) + addNum;
}
addNum = Math.floor(temp/2);//计算要加到下一位的数
let now = temp%2;//计算当前位值
result = `${now}${result}`//拼接
}
if(addNum){
result = `${addNum}${result}`
}
return result;
}