问题描述:下图
输入输出示例
输入:
1
-1 0 1 1 1 0 1 0 1 -1 1
输出:
5
输入:
-1
-1 0 1 1 1 0 1 0 1 -1 1
输出:
1
实现过程:
1.获取数组中每个索引位置的最大连续长度,记录最大的最长
2.并且每个索引最长都与原来最大最长比较
3.打印最大最长索引
//-1 0 1 1 1 0 1 0 1 -1 1 原数组
// 0 4 0 0 0 5 0 3 0 0 0 每个位置最大连续长度
//0 0 0 0 1 0 0 0 0 1 原数组
//1 1 1 2 0 2 1 1 2 0 每个位置最大连续长度
比较,交换最大值;最大值相等,交换索引位置
代码:
public class Test3 {
/*
最有利定义:
1.找到一个空位(0),用棋子(1/-1)填充该位置,可以使得当前子的最大连续长度变大;
2.如果存在多个位置,返回最靠近中间的较小的那个坐标;
3.如果不存在可行位置,直接返回-1;
4.连续长度不能超过5个(五子棋约束);
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = br.readLine()) != null) {
int num = parseInt(str);
String[] strArr = br.readLine().split(" ");
int[] arr = new int[strArr.length];
for (int i = 0; i < strArr.length; i++) {
int temp = parseInt(strArr[i]);
arr[i] = temp;
}
System.out.println(maxLengthIndex(num, arr));
}
}
private static int maxLengthIndex(int num, int[] arr) {
//-1 0 1 1 1 0 1 0 1 -1 1 原数组
// 0 4 0 0 0 5 0 3 0 0 0 每个位置最大连续长度
//0 0 0 0 1 0 0 0 0 1 原数组
//1 1 1 2 0 2 1 1 2 0 每个位置最大连续长度
int maxLength = 0;//最大连续长度
int maxLengthIndex = -1;//最大连续长度的索引位置
double len = arr.length;
double midIndex = (len - 1)/2;//中间索引
for (int i = 0; i < arr.length; i++) {
int max = 0;
if (arr[i] == 0){
int leftMax = 0;
int rightMax = 0;
//计算左边最大
for (int j = i-1; j >= 0; j--) {
if (arr[j] == num){
leftMax++;
if (j-1 < 0 || arr[j-1] != num){
j = 0;
}
}else {
j = 0;
}
}
//计算右边最大
for (int j = i+1; j < arr.length; j++) {
if (arr[j] == num){
rightMax++;
if (j+1 < arr.length || arr[j+1] != num ){
j = arr.length;
}
}else {
j = arr.length;
}
}
max = leftMax + rightMax + 1;
if (maxLength < max){
maxLength = max;
maxLengthIndex = i;
}else if (maxLength == max){
double a = Math.abs(midIndex - maxLengthIndex);
double b = Math.abs(midIndex - i);
if (a > b){
maxLengthIndex = i;
}
}
}
}
return maxLengthIndex;
}
}