代码随想录算法训练营第三十七天|738. 单调递增的数字

目录

738. 单调递增的数字

itoa()实现

我的想法:自己实现itoa()后做完处理atoi()

 优化


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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值