字符串与数字之间互换
- 将数字类型数据结构转换成字符串
int a = 1;
double b = 0.0;
string digit1 = to_string(a);
string digit2 = to_string(b);
cout << digit1 << endl; #1
cout << digit2 << endl; #0.000000
- 将字符串转换成整形数据
- 如果字符串含有小数位,则直接省略掉小数位
int a = 1;
string c = "2.9";
string digit1 = to_string(a);
int b = stoi(digit1);
cout << b << endl; #1
cout << c << endl; #2
例子
思路:当前面的数尽可能大(即尽量不修改),如果遇到前面数字大于后面数字的情况,使前面数字-1,后面数字全取9可以获得最大值。
有两种方法,从前遍历和从后遍历
从后遍历较为简单,如果遇到后值大于等于前值的情况,则continue;否则跟新取9的位置
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string digits = to_string(N);
int j = digits.size();
for (int i = digits.size() - 1; i > 0; i--) {
if (digits[i] >= digits[i - 1]) {
continue;
}
digits[i - 1]--;
j = i;
}
while (j < digits.size()) {
digits[j] = '9';
j++;
}
return stoi(digits);
}
};
从前遍历比较麻烦,需要对重复这种情况进行单独判断,然后对取9位置进行跟新
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string temp = to_string(N);
vector<int> digit;
for(auto e:temp){
digit.push_back(e-'0');
}
if(digit.size()<2){
return digit[0];
}
int mark = 0;
bool flag = false;
int process = false;
for(int i = 1; i < digit.size(); i++){
if(digit[i] > digit[i-1]){
mark = i;
flag = false;
}else if(digit[i] == digit[i-1] && flag == false){
mark = i - 1;
flag = true;
}else if(digit[i] == digit[i-1] && flag == true){
continue;
}else{
process = true;
break;
}
}
if(process==true){
digit[mark] = digit[mark] - 1;
while(mark+1 < digit.size()){
mark = mark+1;
digit[mark] = 9;
}
}
string res;
for(auto e:digit){
res+=to_string(e);
}
int ans = stoi(res);
return ans;
}
};