面了某个大厂,面试官人很nice,知识点不多说了,最大的感悟是他说的为什么不把以前学习的知识成功经验复制到java知识的学习中。
手撕代码的问题也很多,像in.nextInt();竟然忘记加括号。
手撕代码题:
最大的可改变至多一个数字的绝对递增序列
测试用例:
6
7 2 3 1 5 6
5
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++) {
arr[i]=in.nextInt();
}
int max=0;
int flag=0;//是否改变过标志位
int temp=0;
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
if(flag==0&&arr[j-1]>arr[j]) {
temp=arr[j];
arr[j]=arr[j-1]+1;
flag=j;
if(j==n-1) {
max=Math.max(j-i+1, max);//若要改变的是最后一位
}
}else if(flag>0&&arr[j-1]>arr[j]) {
max=Math.max(j-i, max);
if(flag!=(j-1)) {
i=j-1;
}else if(flag==(j-1)) {
i=j-2;
}//直接在此位置进行二重循环,并且要判断是不是改变的那一位
arr[flag]=temp;
flag=0;//标志位重置,开始一个新的二重循环
break;
}else if(j==n-1&&arr[j]>arr[j-1]) {
max=Math.max(j-i+1, max);
i=n;//为了退出外层循环
break;//退出内层循环
}else if(arr[i]<arr[j]) {
continue;
}
}
}
System.out.print(max);
}
}
}
/*6
7 2 3 1 5 6
5*/