首页 > 其他分享 >738. 单调递增的数字

738. 单调递增的数字

时间:2023-05-10 16:12:54浏览次数:34  
标签:int 递增 ++ num strNum 738 size 单调 first

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

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


输入: n = 10
输出: 9

我的解法


class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        std::vector<int> num;
        while (n) {
            int cur = n % 10;
            n = n / 10;
            num.insert(num.begin(), cur);
        }
        if (num.size() == 1) return n;
        int first = -1;
        int left = 0;
        int right = 1;
        for (; right < num.size(); ) {
            if (num[left] < num[right]) {
                first = -1;
                left++;
                right++;
            }
            else if (num[left] == num[right]) {
                if(first == -1 || num[first] != num[left]){
                    first = left;
                }
                left++;
                right++;
            }
            else {
                if (first == -1) {
                    num[left]--;
                    while (right < num.size()) {
                        num[right++] = 9;
                    }
                }
                else {
                    num[first++]--;
                    while (first < num.size()) {
                        num[first++] = 9;
                    }
                }
            }
        }
        int l = num.size() - 1;
        first = 0;
        n = 0;
        while (first < num.size()) {
            n += num[first] * pow(10,l);
            l--;
            first++;
        }
        return n;
    }
};

标准解法


class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string strNum = to_string(N);
        // flag用来标记赋值9从哪里开始
        // 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) {
                flag = i;
                strNum[i - 1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

标签:int,递增,++,num,strNum,738,size,单调,first
From: https://www.cnblogs.com/lihaoxiang/p/17388280.html

相关文章

  • 5.8 单调栈 & 悬线法 & 相关的题(和 dp 也多少沾点)
    今日小题:一个CFdiv2的A的签到题,记录一下这个做法:求一个字符串的最长非回文字符串:无解:长度为1或整个串每个字符都一样;有解:判断这个串是不是回文,如果不是,输出长度,如果是输出长度-1。感觉非常妙。不写证明,感觉非常好想...#include<bits/stdc++.h>usingnamespacestd;i......
  • 【数据结构】单调队列专题(滑动窗口问题)
    一维滑动窗口154.滑动窗口下标从0开始,数组模拟队列#include<iostream>usingnamespacestd;constintN=1e6+10;intn,k;inta[N],q[N];intmain(){scanf("%d%d",&n,&k);for(inti=0;i<n;i++)scanf("%d",&a......
  • [Leetcode] 0674. 最长连续递增序列
    674.最长连续递增序列题目描述给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列可以由两个下标l和r(l<r)确定,如果对于每个l<=i<r,都有nums[i]<nums[i+1],那么子序列[nums[l],nums[l+1],...,nums[r-1],nums[......
  • 7-008-(LeetCode- 300) 最长递增子序列
    1.题目读题 考查点 2.解法思路 代码逻辑 具体实现113.总结......
  • 【dp的二分优化】NO300 最长递增子序列
    【dp的二分优化】300.最长递增子序列给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7,101,18]......
  • 证明 一个 和 三角函数 有关 的 函数 单调递减
    吧主 @黎合胜  只会出物理题,  数学题还得我来,  嘿嘿 。 数学吧  《三角函数问题》     https://tieba.baidu.com/p/8384790600   。  ......
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......
  • FZU Problem 1894 志愿者选拔 单调队列
    题目:http://acm.fzu.edu.cn/problem.php?pid=1894题意:ProblemDescription世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。面试......
  • 23-4-24--子序列--最长连续递增子序列
    给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。输入格式:输入第1行给出正整数n(≤105);第2行给出n个整数,其间以空格分隔。输出格式:在一行中输出第一次出现的最长连续递增子序列,数字......
  • 单调栈学习笔记
    单调栈基础单调栈根据所维护的单调性可以分为四种:严格递增栈。必须出栈至栈空或栈顶小于当前元素后,才入栈当前元素。严格递减栈。必须出栈至栈空或栈顶大于当前元素后,才入栈当前元素。非严格递增栈。必须出栈至栈空或栈顶小于等于当前元素后,才入栈当前元素。非严格递减栈。......