day37

738. 单调递增的数字

中等

315

亚马逊

微软 Microsoft

字节跳动

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

提示:

  • 0 <= n <= 109

 

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] chars=s.toCharArray();
        int start = s.length();

        for(int i=s.length()-2;i>=0;i--){
            if(chars[i]>chars[i+1]){
                chars[i]--;
                start=i+1;
            }
            for(int j=start;j<s.length();j++){
                chars[j]='9';
            }
        } 
        return Integer.parseInt(String.valueOf(chars));
    }
}

这道题必须的背下来,转换语法

1.int 》 String : String s = String.valueOf(n);

2.String > charArray:  char[] chars= s.toCharArray();

3.数组中 char 和 int 转换 char[j]='9';

4.char>string>int : Integer.parseInt(String.valueOf(chars))

在说思路:

贪心,只需要,从后往前,如果cur > cur+1, 则cur-1; 后面的全变成9

暴力算法:参考

class Solution {
private:
    bool checkNum(int num) {
        int max = 10;
        while (num) {
            int t = num % 10;
            if (max >= t) max = t;
            else return false;
            num = num / 10;
        }
        return true;
    }
public:
    int monotoneIncreasingDigits(int N) {
        for (int i = N; i > 0; i--) {
            if (checkNum(i)) return i;
        }
        return 0;
    }
};

如何求各个位数 

while(int num){

num=num/10

这段代码实现了计算两个日期之间的天数差。 ```c++ #include <iostream> using namespace std; int daysBetween(int year1, int month1, int day1, int year2, int month2, int day2) { int days = 0; int monthDays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // monthDays数组存储每个月份的天数 for (int i = year1; i < year2; i++) { if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) { // 判断是否为闰年 days += 366; } else { days += 365; } } if ((year2 % 4 == 0 && year2 % 100 != 0) || year2 % 400 == 0) { monthDays[2] = 29; // 如果第二个日期所在的年份是闰年,2月份天数为29天 } for (int i = 1; i < month1; i++) { days -= monthDays[i]; // 减去第一个日期所在月份之前的天数 } days -= day1; // 减去第一个日期所在月份的天数 for (int i = 1; i < month2; i++) { days += monthDays[i]; // 加上第二个日期所在月份之前的天数 } days += day2; // 加上第二个日期所在月份的天数 return days; } int main() { int year1, month1, day1; int year2, month2, day2; cin >> year1 >> month1 >> day1; cin >> year2 >> month2 >> day2; cout << daysBetween(year1, month1, day1, year2, month2, day2) << endl; return 0; } ``` 代码翻译: 第1-2行:引入iostream库,使用std命名空间 第4-11行:定义了一个函数daysBetween,接受六个int类型参数,分别为两个日期的年、月、日 第12-13行:初始化变量days和monthDays数组,monthDays数组存储每个月份的天数,其中第一个元素为0,后面的元素分别为1月到12月的天数 第14-22行:计算两个日期之间的年数差,对于每一年,如果是闰年,则天数加上366,否则加上365 第23-25行:如果第二个日期所在的年份是闰年,将2月份的天数调整为29天 第26-29行:减去第一个日期所在月份之前的天数和第一个日期所在月份的天数 第30-33行:加上第二个日期所在月份之前的天数和第二个日期所在月份的天数 第34行:返回计算出的天数差 第36-37行:主函数,读入两个日期,计算天数差并输出结果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值