编程要求
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
输入描述:
输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
输入例子:
4
1 1 1 3
输出例子:
2
import java.util.Scanner;
public class Main {
static int count = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int length = scanner.nextInt();
int[] array = new int[length];
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
add(array);
System.out.println(count);
}
public static void add(int[] array) {
int length = array.length;
int head = array[0];
int foot = array[length - 1];
if (head == foot) {
if (!check(array)) {
int[] arr = new int[length - 2];
for (int i = 0; i < arr.length; i++) {
arr[i] = array[i + 1];
}
add(arr);
}
} else {
count++;
int[] arr = new int[length - 1];
if (head > foot) {
for (int i = 0; i < arr.length; i++) {
arr[i] = array[i];
if (i == length - 2) arr[i] += array[i + 1];
}
} else {
for (int i = 0; i < arr.length; i++) {
arr[i] = array[i+1];
if (i == 0) arr[i] += array[i];
}
}
add(arr);
}
}
public static boolean check(int[] array) {
int length = array.length;
int half = length / 2;
for (int i = 0; i < half; i++) {
if (array[i] != array[length - i - 1]) {
return false;
}
}
return true;
}
}
check方法用于检测数组是否符合回文序列的规则,把数组从中间分开,然后头尾比较,如果全部相等,就说明符合回文序列的规则。
回文序列的可以简单能理解为头尾相等,根据编程要求,把两个相邻的数值相加放回原位,操作多次,使得数组符合回文序列。
我们只要判断头尾是否相等,就能知道是否执行相加操作,如果相等我们可以掐头去尾以后再进行比较,直到满足要求。
如果头尾不相等,我们就需要进行相加操作,那是从头部开始加呢,还是从尾部开始加呢,就要比较两个数字的大小,哪边小就从哪边进行相加操作,这样才可能和大的一方相等,如果对大的一方进行相加操作,则永远不会等于小的一方,就会导致计算结果有误。