1.摆动序列
[2,5,7]我们默认认为[2,2,5,7],因此我们记录答案的时候默认从第一个开始。
我们还需要设置当前差和前一个差值
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length<=1){
return nums.length;
}
/*
* 由于计算的是差值,[2,5]我们视为[2,2,5],因此res默认为1
*/
int currentLen = 0;//当前两数差值
int prevLen = 0;//前两数差值
int res = 1;//默认为最右面有一个峰值
//因此我们从1开始
for(int i=1;i<nums.length;i++){
currentLen=nums[i]-nums[i-1];
if((prevLen>=0&¤tLen<0)||(prevLen<=0&¤tLen>0)){
res++;
prevLen=currentLen;//重新计算下一个当前值
}
}
return res;
}
}
2.单调递增的数字
我们需要先从后向前遍历,并且记录当前位置(物理)。332–>322->222。当前位置为1
再从前往后遍历,只要大于等于当前位置的数字都替换成9
需要注意的是,我们要把Integer.toString(n).toCharArray(),转换为字符数组
class Solution {
public int monotoneIncreasingDigits(int n) {
if(n==0) return 0;
//将数字转换成char数组
char[] chars = Integer.toString(n).toCharArray();
//记录修改的位置
int start = Integer.MAX_VALUE;
//从后向前遍历
for(int i=chars.length-1;i>0;i--){
if(chars[i]<chars[i-1]){
chars[i-1]--;
start=i;//记录当前修改的物理地址
}
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<chars.length;i++){
if(i>=start){
sb.append('9');
}else{
sb.append(chars[i]);
}
}
return Integer.parseInt(sb.toString());//转换为int型
}
}