1、字符串转换整数
class Solution {
public:
int myAtoi(string s) {
int i = 0;
int sign = 1; // 用于记录正负号,默认为正数
int result = 0;
// 去除前导空格
while (i < s.length() && s[i] == ' ') {
i++;
}
// 判断正负号
if (i < s.length() && (s[i] == '+' || s[i] == '-')) {
sign = (s[i] == '-') ? -1 : 1;
i++;
}
// 转换数字
while (i < s.length() && isdigit(s[i])) {
int digit = s[i] - '0';
// 检查是否溢出,这个必须要有,否则不能通过
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) {
return (sign == -1) ? INT_MIN : INT_MAX;
}
result = result * 10 + digit;
i++;
}
return result * sign;
}
};
class Solution {
public:
string countAndSay(int n) {
if(n == 1) return "1";
else{
string previous = countAndSay(n - 1);
string result = "";
int count = 1;
for(int i = 0; i < previous.size(); i++){
if(i == previous.size() - 1 || previous[i] != previous[i + 1]){
result += to_string(count) + previous[i];
count = 1;
}
else{
count++;
}
}
return result;
}
}
};
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
//从给出的数组中挑出任意三个能够构成相加等于0的三个数
sort(nums.begin(), nums.end());
//先排序
vector<vector<int>> result;
for(int i = 0; i < n - 2; i++){
//过滤掉重复的
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
//因为是排序的,如果第一个数字大于0,那么后面的也都大于0,他们三个数字的和不可能等于0
if(nums[i] > 0){
break;
}
int left = i + 1; //左指针
int right = n - 1; //右指针
int target = -nums[i];
while(left < right){
//左右指针的和
int sum = nums[left] + nums[right];
//找到了一组,把他们加到result数组中;
if(sum == target){
result.push_back({nums[i], nums[left], nums[right]});
//过滤掉重复的
while(left < right && nums[left] == nums[left+1]){
left++;
}
while(left < right && nums[right] == nums[right-1]){
right--;
}
left++;
right--;
}
else if(sum < target){
left++;
}else{
right--;
}
}
}
return result;
}
};