class Solution {
public:
int reverse(int x) {
if(x>INT_MAX||x<-INT_MAX) return 0; // 可能输入的数就超出范围
if(x>-10&&x<10) return x; // 个位数不用反转直接输出
string s;
int flag = 0;
if(x<0){ // 负数标记一下
flag = 1;
x = -x;
}
while(x){
int t = x%10;
// cout << "t: " << t << endl;
s += t+'0';
x /= 10;
}
long long ans = s[0]-'0'; // 处理的过程中可能越界,需要用ll存储
for(int i = 1; i < s.size(); i ++){
ans *= 10;
ans += s[i]-'0';
}
if(flag) ans *= -1;
if(ans>INT_MAX||ans<-INT_MAX) return 0;
return ans;
}
};
class Solution {
public:
int myAtoi(string s) {
long long f = 0, ans = 0;
for(int i = 0; i < s.size(); i ++){
if(s[i]=='-'){
if(i+1<s.size()&&!isdigit(s[i+1])) return 0; " -x" " - 10"的输出都为0
f = 1;
}
else if(isdigit(s[i])){
ans *= 10;
if(ans>=0) ans += s[i]-'0';
else ans -= s[i]-'0';
if(ans&&f){
ans *= -1;
f = 0;
}
// cout << "si: " << s[i] << " ans: " << ans << endl;
if(ans<0&&ans<-INT_MAX-1){
ans = -INT_MAX-1;
return ans;
}
if(ans>0&&ans>INT_MAX){
ans = INT_MAX;
return ans;
}
if(i+1<s.size()&&!isdigit(s[i+1])) break; // 遇到第一个非数字时终止
}
else if(s[i]==' ') continue; // 去除前导零
else if(s[i]=='+'){
if(!ans&&i+1<s.size()&&isdigit(s[i+1])) continue;
else break; // "+-10"输出为0
}
else break;
}
return ans;
}
};
class Solution {
public:
string toBinary(int x){
string ans;
while(x){
ans += (x%2)+'0';
x /= 2;
}
reverse(ans.begin(), ans.end());
return ans;
}
int binaryGap(int n) {
string s = toBinary(n);
int pos = -1, ans = 0;
for(int i = 0; i < s.size(); i ++){
if(s[i]=='1'){
if(pos==-1) pos = i;
else{
ans = max(ans, i-pos);
pos = i;
}
}
}
return ans;
}
};
class Solution {
public:
string intToRoman(int num) {
map<int, string> mp;
mp[1] = "I"; mp[4] = "IV";
mp[5] = "V"; mp[9] = "IX";
mp[10] = "X"; mp[40] = "XL";
mp[50] = "L"; mp[90] = "XC";
mp[100] = "C"; mp[400] = "CD";
mp[500] = "D"; mp[900] = "CM";
mp[1000] = "M";
int a[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string ans;
for(int i = 0; i < 13; i ++){
if(num/a[i]){
int cnt = num/a[i];
while(cnt--){
ans += mp[a[i]];
}
num %= a[i];
}
}
return ans;
}
};
双指针:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = nums[0]+nums[1]+nums[2], n = nums.size();
for(int i = 0; i < n; i ++){
int l = i+1, r = n-1;
while(l<r){
int sum = nums[l]+nums[r]+nums[i];
if(abs(sum-target)<abs(ans-target)) ans = sum;
if(sum>target) r --;
else if(sum<target) l ++;
else return ans;
}
}
return ans;
}
};