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

文章目录

      • 738.单调递增的数字
      • day8 字符串复习

738.单调递增的数字

通过贪一部分值,达到高效的方法

  • 链接:代码随想录

  • 解题思路:
    ①暴力判断的方法时间复杂度为O(m * n),会超时
    ②贪心:贪在只判断数字大小
    如果nums[i - 1] > nums[i] 做出nums[i - 1]–,nums[i] = 9
    (让数字最大),这样的操作一次for循环遍历,就可以判断判断出结果

public int monotoneIncreasingDigits(int n) {

    String s = String.valueOf(n);//变为字符串
    char[] chars = s.toCharArray();//为了防止多次创建String
    int flag = chars.length;//记录变9的最小位置,这里初始化是为了防止如1234
    //这个数没有改动,但是把flag从头到尾都遍历的情况

    for (int i = chars.length - 1; i > 0; i--) {
        //判断是否递增
        if(chars[i - 1] > chars[i]){
            chars[i - 1]--;
            flag = i;
        }
    }

    //进行9赋值
    for (int i = flag; i < chars.length; i++) {
        chars[i] = '9';
    }

    return Integer.parseInt(String.valueOf(chars));
}

day8 字符串复习

  • 反转字符串系列就是,双指针并加区间问题
  • 去除空格,是双指针法在数组填充中的应用
  • 翻转字符串里的单词,就是先去掉多余的空格,将字符串反转(从右向左看),然后再逐个反转区间内的单词(因为有空格存在)
  • 左旋字符串,在于处理反转两次子串的逻辑和最后反转最后一次字符串的逻辑

空格存在)

  • 左旋字符串,在于处理反转两次子串的逻辑和最后反转最后一次字符串的逻辑

你可能感兴趣的:(代码随想录一刷,算法)