题解 | #最长不含重复字符的子字符串#

大数加法

http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

 

注意:字符进行数***算的时候,每个数相差48             (字符进行算术运算时,会转换成ASCII值在进行运算)  一个减去'0'。  public static void main(String[] args) {
        String solve = solve("657", "543");
        System.out.println(solve);
//        StringBuilder demo = new StringBuilder();
//        demo.append("a");
//        demo.append("f");
//        demo.append("g");
//        System.out.println(demo);
    }


    public  static   String solve(String str1, String str2) {
        if (str1 == null || ("".equals(str1))) {
            return str2;
        }
        if ("".equals(str2)) {
            return str1; }

        int maxLength = Math.max(str1.length(), str2.length());
   //定义一个字符串 长度+1         用于储存可能出现的进位
        StringBuilder result = new StringBuilder(maxLength + 1);//注意



        //翻转两个字符串
        str1 = new StringBuilder(str1).reverse().toString();
        str2 = new StringBuilder(str2).reverse().toString();

        int minLength = Math.min(str2.length(), str1.length());  
        //位进
        int carry = 0;
        //当前位上的数值
        int currentNum = 0;
        int i = 0;
        for (; i < minLength; i++) {                                           //先从最小的那个数进行,之后有个全局的变量i记录到已经相加的元素,再往后进行相加
            currentNum = str2.charAt(i) + str1.charAt(i) - 2 * '0' + carry;
            //获取进位
            carry = currentNum / 10;
            //处理当前位置的最终值
            currentNum %= 10;
            //保存当前位的值到最终的字符缓冲区中
            result.append(String.valueOf(currentNum));

        }
        if (str1.length() < str2.length()) {
            //选择
            str1 = str2;
        }
        for (; i < str1.length(); i++) {                 //往后进行相加
            currentNum = str1.charAt(i) - '0' + carry;
            //获取进位
            carry = currentNum / 10;
            currentNum %= 10;
            result.append(String.valueOf(currentNum));
        }
        //处理最后一个进位( 当循环结束后,是不是还可能又一个进位)
        if (carry>0){
            result.append(String.valueOf(carry));
        }
        return result.reverse().toString();
    }

传统的解法,超过一定的容量会报错。
采用字符串翻转的方法进行


全部评论

相关推荐

牛客389580366号:读书的意义在于提升自己和他人吧,“阶级意识”是读书过程中的产出,“跨越阶级”是通过读书获得的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务