题目描述:
新一年开工,薯队长为你准备了一个数字游戏。
现在有由N个整数组成的数组,其中每一个整数只可以是0或者1。你可以选择一个区间范围[i, j],其中i<=j,对其中所有数字进行翻转。对整数a进行翻转会得到1-a。
你只有一次翻转的机会,薯队长希望知道经过一次翻转后,新的数组中1的个数最多是多少,聪明的你可以帮助薯队长解决这个问题吗?如果数组长度为0,直接返回-1。
例如 [1, 0, 0, 1, 0],可以翻转为 [1, 1, 1, 0, 1] 或 [1, 1, 1, 1, 0],所以结果为4。
输入描述
第一行,整数,表示整数数组中整数的个数
第二行,依次是数组中每一个整数,以单空格间隔
数据范围:数组长度在[0,100000]之间。
注意:不同语言读取数据时,请注意数据类型,避免类型错误。
输出描述
整数,表示经过一次翻转后,新的数组中1出现的最大次数
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(m());
}
public static int m() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n < 100000 && n != 0) {
//创建一个N个整数组成的数组
ArrayList arr = new ArrayList();
//填充数据
for (int i = 0; i < n; i++) {
String s = sc.next();
arr.add(s.charAt(0));
}
int[][] arr2 = new int[n][n];
//接受所有反转情况后,1的个数的数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-i; j++) {
//每次反转都新建一个数组
char[] arr3 = new char[n];
//填充数据
for (int k = 0; k < n; k++) {
arr3[k] = arr.get(k);
}
//反转
arr2[i][j] = reversal(i,j,arr3);
}
}
//找到最大值
int max = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr2[i][j]>max){
max = arr2[i][j];
}
}
}
return max;
} else {
return -1;
}
}
public static int reversal(int a, int b, char[] arr){
int cont=0;
if (b>=a){
//反转
for (int i = a; i <= b; i++) {
if (arr[i] == '0') {
arr[i] = '1';
}else if (arr[i] == '1'){
arr[i] = '0';
}
}
// 计数
for (char ar: arr
) {
if (ar == '1'){
cont++;
}
}
}
return cont;
}
}



