前言
刚刚做完字节的笔试,就赶紧来记录一下。字节确实题好难的,这可能就是大佬们的常规操作吧。还是要提高自己才可以,为自己蓄力,也希望大家指正不足之处。
- 题目:
对于两个长度为n的数组a,b。通过某种操作将a数组变成为b数组。这个操作就是:从L-R区间段为每个数字都加上相同的值k。
其中:1<=L<=R<=n,k>=0; - 输入描述:首先输入一个数字t,表示有t组数据,每组数据的第一行为一个数字n表示数组的长度,接下来两行,每行有n个数字,分别为数组a和数组b。
- 输出描述: 对于每组数据输出YES或者NO,表示数组a能否通过对应的操作变成数组b。
- 样例:
// 输入
2
6
3 7 1 4 1 2
3 7 3 6 3 2
6
1 1 1 1 1
1 2 1 3 1
// 输出
YES
NO
- 简单分析
这题其实也很简单,我们只需对两个数组同位置的元素进行大小比较。同位置比较相等继续进行下一个位置的比较;否则,就加上起始的k值,再次比较,若不相同则失败。并且我们只能计算一次k,当需要第二次进行k值的计算的时候,那么也就判定失败了。
那么,我们就废话不多说了,直接上代码吧…
public static void aChangeb(){
Scanner in = new Scanner(System.in);
// 数据组的个数
final int groupCount = in.nextInt();
// 每个数据组均采用map的形式来存储
Map<Integer,List<int[]>> mapList = new HashMap();
// 每组数据的长度(数组的长度)
int[] lenList = new int[groupCount];
// 结果列表(YES|NO 按序存放)
List<String> resultList = new ArrayList<>(groupCount);
// 获取输入的数据信息
for(int i = 0; i < groupCount; ++i){
final int len = in.nextInt();
lenList[i] = len;
List<int[]> temp = new ArrayList<>(2);
for(int j = 0; j < 2; j++){
Scanner scanner = new Scanner(System.in);
final String s = scanner.nextLine();
// System.out.println(s);
final int[] array = Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
// System.out.println(array.length);
temp.add(array);
}
mapList.put(i,temp);
}
// a转换为b的操作
for(int i = 0; i < groupCount; ++i){
final List<int[]> ints = mapList.get(i); // 数据组
final int[] one = ints.get(0); // a数组
final int[] two = ints.get(1); // b数组
int len = lenList[i];
int l = 0; // a数组的初始位置
int k = 0; // 初始K值
boolean canChange = true; // 能否转换
boolean kChange = false; // K值是否改变
for(int j = 0; j < two.length; ++j,++l){
if(l == 0 && (one[l] + k) != two[j]){
kChange = true;
k = two[j] - one[l];
} else {
// if(kChange){
// canChange = false;
// break;
// }
if((l > 0 && l < len) && (one[l] != two[j])){
if((one[l] + k) != two[j]){
if(kChange){
canChange = false;
break;
}
kChange = true;
k = two[j] - one[l];
}
}
}
}
resultList.add(canChange ? "YES" : "NO");
}
// 输出结果
for(String s : resultList){
System.out.println(s);
}
}
小生不才,欢迎大家来指教!