题解 | #大数相减#

大数相减

https://www.nowcoder.com/practice/ae4d84312e384a1fa100b613f93f3fe0?tpId=196&tqId=40449&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj&difficulty=undefined&judgeStatus=undefined&tags=595&title=

将字符串转为数组,进行减法模拟运算;

代码+详细注释

小小蒟蒻的代码若有错误或不足,欢迎各位大佬指正

class Solution {
public:
     bool com(string s1,string s2){//判断两个字符串哪个大,要用大数减小数;
        int u=s1.size(),v=s2.size();
        if(u!=v)
        return u>v;
        for(int i=0;i<u;i++){
            if(s1[i]!=s2[i]){
                return s1[i]>s2[i];
            }
        }
        return true;
     }
    string substring(string num1, string num2) {
        // write code here,
        int flag=0;
        vector<int>vec1(100100);  //数组一定要开大一点,容易越界;
        vector<int>vec2(100100);
        if(!com(num1,num2)){  //进入判断,若第二个字符串大则交换,并进行标记;
            flag=1;   //标记,后续加负号;
            num1.swap(num2);
        } 
        int n1=num1.size(),n2=num2.size();
        for(int i=0;i<n1;i++){  //字符串转数组;(倒着存储有助于我们后面减的时候,对齐数位)
            vec1[n1-i]=num1[i]-'0';
        }
        for(int i=0;i<n2;i++){  //字符串转数组;(同理)
            vec2[n2-i]=num2[i]-'0';
        }
        int n=max(n1,n2);   //差数组的长度选择两个数组中最大长度的数组;
        vector<int>c(100100);
        for(int i=1;i<=n;i++){  //减法模拟
            if(vec1[i]<vec2[i]){  //若小于则向后借10;(因为前面数组是倒着存储的)
                vec1[i+1]--;  //后面的数减1;
                vec1[i]+=10;  //借10;
            }
            c[i]=vec1[i]-vec2[i];//两数相减;
        }
        while(c[n]==0&&n>1){   //删除前导0;
            n--;
        }
        string a="";
        if(flag){
                a+="-";   //若被标记过,则加负号;
        }
        for(int i=n;i>0;i--){
            a+=to_string(c[i]);//将数组转为字符;
        }
        return a;
    }
};

创作不易,可否求个小赞赞

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务