记录一下吧,虽然我感觉挺简单的,但是由于第一次笔试,紧张刺激加上不会用在线的那种调试,导致一个变量名出错,最后没做出来,还是整理一下思路吧。
要求:
路的两边种树,一边全是奇数,即1,3,5...99;一边全是偶数,即2,4,6...100;两边各50棵树,现在输入几个数,表示砍掉的数的标号,请返回可以连续砍的树的数量的最大值及开始砍的树的索引。
示例:
输入:5
9 15 27 35 6
输出:47 8
思路:
- 读入砍的树的数量,创建一个数组
- 读入砍树的编号
- 用一个count记录奇数的个数,并得出偶数的个数
- 创建两个数组,一个用来存放奇数序列号的树,一个用来存放偶树序列号的树
- 创建两个数组,和之前两个数组对应,但是数组长度加一,因为一段距离,剪n刀,其实会有n+1段的,所以数组长度加一
- 对于这两个数组中,每个数组的第一个数和最后一个数都需要注意,因为它们的计算方式和中间的间隔长度的计算方式不一样。以奇数为例:第一个数是(n-1)/2(假设第一个树的索引是n),最后一个数是(99-n)/2(假设最后一个树索引是n)。
- 数组中其他的数就是
(nums[i+1]-nums[i])/2-1 - 最后随便是动态规划还是遍历数组,寻得最大值就行了,而且是从每个数组的第二个数开始寻找,更新最大值的时候顺便把索引也返回,即i
- 去原始的奇偶数组里去找最后需要返回的那个索引,就是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!