浪潮Java笔试--砍树

920 阅读3分钟

记录一下吧,虽然我感觉挺简单的,但是由于第一次笔试,紧张刺激加上不会用在线的那种调试,导致一个变量名出错,最后没做出来,还是整理一下思路吧。

要求:

路的两边种树,一边全是奇数,即1,3,5...99;一边全是偶数,即2,4,6...100;两边各50棵树,现在输入几个数,表示砍掉的数的标号,请返回可以连续砍的树的数量的最大值及开始砍的树的索引。

示例:

输入:5
      9 15 27 35 6
输出:47 8

思路:

  1. 读入砍的树的数量,创建一个数组
  2. 读入砍树的编号
  3. 用一个count记录奇数的个数,并得出偶数的个数
  4. 创建两个数组,一个用来存放奇数序列号的树,一个用来存放偶树序列号的树
  5. 创建两个数组,和之前两个数组对应,但是数组长度加一,因为一段距离,剪n刀,其实会有n+1段的,所以数组长度加一
  6. 对于这两个数组中,每个数组的第一个数和最后一个数都需要注意,因为它们的计算方式和中间的间隔长度的计算方式不一样。以奇数为例:第一个数是(n-1)/2(假设第一个树的索引是n),最后一个数是(99-n)/2(假设最后一个树索引是n)。
  7. 数组中其他的数就是(nums[i+1]-nums[i])/2-1
  8. 最后随便是动态规划还是遍历数组,寻得最大值就行了,而且是从每个数组的第二个数开始寻找,更新最大值的时候顺便把索引也返回,即i
  9. 去原始的奇偶数组里去找最后需要返回的那个索引,就是i对应的数加2即可

代码:

public class kanshu {
	public static void main(String[] args) {
		Scanner sc  = new Scanner(System.in);
		int m = sc.nextInt();
		int[] nums = new int[m];
		int count = 0;
		int index1 = 0;
		int res1 = 0;
		int index2 = 0;
		int res2 = 0;
		for (int i = 0; i < m; i++) {
			nums[i] = sc.nextInt();
		}
		for (int i = 0; i < m; i++) {
			if (nums[i]%2 == 1) {//为奇数
				count++;
			}
		}
		int len1 = count;//奇数个数
		int len2 = m-count;//偶书个数
		if (len1 == 0) {
			System.out.println(1+" "+50);
			//res1 = 50;
			//index1 = 1;
		}
		if (len2 == 0) {
			//res2 = 50;
			//index2 = 2;
			System.out.println(2+" "+50);
		}
		int[] arr1 = new int[len1];
		int[] arr2 = new int[len2];
		for (int i = 0; i < len1; i++) {
			arr1[i] = nums[i];
		}
		for (int i = 0; i < len2; i++) {
			arr2[i] = nums[i+len1];
		}
		int[] result1 = new int[len1+1];
		result1[0] = (arr1[0]-1)/2;
		result1[len1] = (99-arr1[len1-1])/2;
		for (int i = 1; i < len1; i++) {
			result1[i] = (arr1[i]-arr1[i-1])/2 - 1;
		}
		int[] result2 = new int[len2+1]; 
		result2[0] = (arr2[0]-2)/2;
		result2[len2] = (100-arr2[len2-1])/2;
		for (int i = 1; i < len2; i++) {
			result2[i] = (arr2[i] - arr2[i-1])/2 -1;
		}
		res1 = result1[0];
		index1 = 1;
		for (int i = 1; i <= len1; i++) {
			if (result1[i] > res1) {
				res1 = result1[i];
				index1 = arr1[i-1]+2;
			}
		}
		res2 = result2[0];
		index2 = 2;
		for (int i = 0; i <= len2; i++) {
			if (result2[i] > res2) {
				res2 = result2[i];
				index2 = arr2[i-1] + 2;
			}
		}
		
		if (res1 >= res2) {
			res1 = res1;
			index1 = index1;
		} 
		
		if (res1 < res2) {
			res1 = res2;
			index1 = index2;
		}
		System.out.println(index1+" "+res1);
	}
}

最后,希望自己能不断汲取经验,早日拿到offer,come on!