2020春招字节跳动编程题

前言

刚刚做完字节的笔试,就赶紧来记录一下。字节确实题好难的,这可能就是大佬们的常规操作吧。还是要提高自己才可以,为自己蓄力,也希望大家指正不足之处。

  • 题目
    对于两个长度为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);
   	}

   }

小生不才,欢迎大家来指教!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值