目录
738. 单调递增的数字
题目链接:738. 单调递增的数字
题目描述:
当且仅当每个相邻位数上的数字
x
和y
满足x <= y
时,我们称这个整数是单调递增的。给定一个整数
n
,返回 小于或等于n
的最大数字,且数字呈 单调递增 。
重要的是不眼高手低!想到什么办法就试试,别老想着直接写出最精简的方法,清楚用数组存储会更方便就试试。
itoa()实现
char* itoa(int digit){
char *ret=(char *)malloc(sizeof(char)*11);
int index=0;
//将数字各个位数拆解成字符逆序存入ret
while(digit){
ret[index++]=(digit%10)+'0';
digit/=10;
}
ret[index]='\0';
int left=0;int right=index-1;
char temp='\0';
//逆置字符串
while(left<right){
temp=ret[left];ret[left]=ret[right];ret[right]=temp;
left++;right--;
}
return ret;
}
我的想法:自己实现itoa()后做完处理atoi()
对于遍历顺序:从左到右的话注意示例:332
3 3 2
处理后: 3 2 9
正确答案: 2 9 9
再想做处理就得从头开始。
因此选择从右到左遍历!
int monotoneIncreasingDigits(int n){
char* s=itoa(n);
int i=strlen(s)-1;
for(;i>0;i--){
if(s[i]<s[i-1]){
s[i-1]--;
for(int j=i;j<strlen(s);j++){
s[j]='9';
}
}
}
return atoi(s);
}
优化
上面代码每出现不是递增的数后,都对之后的所有元素置9,出现了重复操作的现象。
对其进行优化:flag用来记录需要改变的位置,每出现不是递增的数更新一次,最后flag记录的是首次需要置9的位置。
int monotoneIncreasingDigits(int n){
char* s=itoa(n);
int i=strlen(s)-1;
int flag;
for(;i>0;i--){
if(s[i]<s[i-1]){
s[i-1]--;
flag=i;
}
}
for(;flag<strlen(s);flag++){
s[flag]='9';
}
return atoi(s);
}