兩非負整數字符串相乘,返回積字符串。模擬豎式乘法:
mid[i+j]
string multiply(string num1, string num2) {
if (num1=="0" || num2=="0") return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
vector mid(num1.size() + num2.size(), 0);
for (int i=0; i= 10) {
mid[i+1] += mid[i] / 10;
mid[i] %= 10;
}
}
while (mid.size()>1 && mid.back()==0) mid.pop_back();
string res;
for (int i=mid.size()-1; i>=0; --i) res.push_back('0'+mid[i]);
return res;
}
利用 next_permutation 字典序生成:
sort 得到最小排列next_permutation 直到返回 false
bool nextPermutation(vector& nums) {
int i = nums.size()-2;
while (i>=0 && nums[i] >= nums[i+1]) --i;
if (i < 0) return false;
int j = nums.size()-1;
while (nums[j] <= nums[i]) --j;
swap(nums[i], nums[j]);
reverse(nums.begin()+i+1, nums.end());
return true;
}
vector> permute(vector& nums) {
sort(nums.begin(), nums.end());
vector> res;
do { res.push_back(nums); } while (nextPermutation(nums));
return res;
}
此法自動處理 Permutations II(含重複元素),因 next_permutation 基於字典序去重。