周赛139:5076,5078

大佬的思路就是厉害,很快就能写出来了:首先求两个字符串长度的最大公约数就是它们共有的最大子串。然后看它是否是这两个字符串的最大公因子,即由这个共有子串循环n次得到。

class Solution {
public:
    int gcd(int n, int m){
        if(n==0) 
            return m;
        else 
            return gcd(m%n, n);
    }
    
    bool isMatch(string str1, string str2){
        for(int i=0; i<str1.size(); i++){
            if(str1[i] != str2[i % str2.size()])
                return false;
        }
        return true;
    }
    
    string gcdOfStrings(string str1, string str2) {
        int n = str1.size();
        int m = str2.size();
        int l = gcd(n,m);
        string str3 = str1.substr(0,l);
        if(isMatch(str1, str3) && isMatch(str2, str3)) return str3;
        else
            return "";
    }
};

 

思路:逢2进-1,逢-2进1

因为vector保存的arr1和arr2,索引小的表示的是高位,索引大的表示的是低位,即 arr1=[1,1,1,1,1] 对应的索引为:[0,1,2,3,4],所以将arr1和arr2反转。

carry 保存进位,a3为当前位的值。

class Solution {
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        vector<int> arr3;
        reverse(arr1.begin(), arr1.end());
        reverse(arr2.begin(), arr2.end());

        int carry = 0;
        int a3 = 0;
        
        for(int i=0; i<max(arr1.size(), arr2.size()) || carry!=0; i++){
            int a1 = i<arr1.size() ? arr1[i] : 0;
            int a2 = i<arr2.size() ? arr2[i] : 0;
            a3 = a1 + a2 + carry;
            carry = a3 / (-2);
            a3 %= (-2);
            if(a3<0){
                a3 = -a3;
                ++carry;
            }
            arr3.push_back(a3);    
        }
        
        while(arr3.size()>1 && arr3.back()==0) arr3.pop_back();
        reverse(arr3.begin(), arr3.end());
        return arr3;
    }
};

 

posted @ 2019-06-02 21:44  爱学英语的程序媛  阅读(190)  评论(0编辑  收藏  举报