編程要求
如果一個數字序列逆置之后跟原序列是一樣的就稱這樣的數字序列為回文序列。例如: {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方法用于檢測數組是否符合回文序列的規則,把數組從中間分開,然后頭尾比較,如果全部相等,就說明符合回文序列的規則。
回文序列的可以簡單能理解為頭尾相等,根據編程要求,把兩個相鄰的數值相加放回原位,操作多次,使得數組符合回文序列。 我們只要判斷頭尾是否相等,就能知道是否執行相加操作,如果相等我們可以掐頭去尾以后再進行比較,直到滿足要求。 如果頭尾不相等,我們就需要進行相加操作,那是從頭部開始加呢,還是從尾部開始加呢,就要比較兩個數字的大小,哪邊小就從哪邊進行相加操作,這樣才可能和大的一方相等,如果對大的一方進行相加操作,則永遠不會等于小的一方,就會導致計算結果有誤。
新聞熱點
疑難解答