周赛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; } };