1、数组初始化
java数组一定要初始化吗?不初始化可以 么,java的数组变量是引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可以正常使用该数组变量
2、数组拷贝
1.System.arraycopy():
系统级别的native原生方法,效率高
参数含义:(源数组, 原数组的开始位置, 目标数组, 目标数组的开始位置, 拷贝长度)
2.Arrays.copyOf():
它的实现还是基于System.arraycopy()
参数含义:(源数组,拷贝长度)
3.Arrays.copyOfRange:
它的实现还是基于System.arraycopy()
参数含义:(源数组,开始位置,拷贝长度)。
4.Object.clone():
从源码来看同样也是native方法,但返回为Object类型,所以赋值时将发生强转,所以效率不如之前三种。
import java.util.*;
class Main{
private static int n;
private static int[] w;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t-- > 0){
n = sc.nextInt();
w = new int[n];
for(int i = 0; i < n; i++) w[i] = sc.nextInt();
int depth = 0;
while(depth < 5 && !dfs(0, depth)) depth++;
if(depth == 5) System.out.println("5 or more");
else System.out.println(depth);
}
}
private static boolean dfs(int u, int depth){
if(u + f(w) > depth) return false;
if(f(w) == 0) return true;
int[] backup; //并没有初始化也可以使用
for(int len = 1; len <= n; len++){
for(int l = 0; l + len - 1 < n; l++){
int r = l + len - 1;
for(int k = r + 1; k < n; k++){
backup = w.clone();
int y = l;
for(int x = r + 1; x <= k; x++, y++) w[y] = backup[x];
for(int x = l; x <= r; x++, y++) w[y] = backup[x];
if(dfs(u + 1, depth)) return true;
w = backup.clone();
}
}
}
return false;
}
private static int f(int[] w){
int cnt = 0;
for(int i = 0; i + 1 < n; i++){
if(w[i] + 1 != w[i + 1]) cnt++;
}
return (cnt + 2) / 3;
}
}