算法题:字符串相加

链接:https://www.nowcoder.com/questionTerminal/c5649746e03140978f347bbb72282ad1
来源:牛客网

输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。
字符串长度不超过100。
示例1
输入
"1101","1100"
输出
"11001"
示例2
输入
"110101","1010110"
输出
"10001011"

思路:

  1. 取出较长的字符串用于遍历
    	let str = str1;//较长的字符串
        let strElse = str2;//较短的字符串
        if(str1.length < str2.length){
            str = str2;
            strElse = str1;
        }
    
  2. 倒着取数,即从个位数开始取,有俩个临界点:短字符串的最高位长的字符串的最高位
     for(let i = 1; i <= str.length; i++){//在较长字符长度范围内执行
             if(strElse.length >= i){//在较短字符长度范围内执行
         		   //俩个字符串都有位值 
             }else{
     			//只有较长的字符串有位值
     		}
         }
    
  3. 每位值的数据获取:
    str.substr(-i, 1)
  4. 每位值得数据处理:二进制满2进1,需要设置一个addNum来记录当前位是否需要进值,以及用now记录进制后当前位的值
    比如当前位temp为2,进一,下一位addNum为1,当前进制后的值now就为0
            addNum = Math.floor(temp/2);//计算要加到下一位的数
            let now = temp%2;//计算当前位值
    
  5. 每位位值的相加结果:除了要判断是否俩个值都有位值要相加之外,还要加上上一个位值进的值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;  
            }
    
  6. 循环结束后判断是否还有进制值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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值