选取是3个题目中的第3题,题目是这样的:
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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
以下是我自己的答案,仅供参考,因为当时在做的时候,思维混乱了,一心想着把3题都完成,没沉住气,乱了,没写出来,于是今天早上来重写了下,大约半小时就好了。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int len=scan.nextInt();
List<Integer> list = new ArrayList<Integer>();
int handleTimes = 0;
for (int i = 0; i < len; i++) {
list.add(scan.nextInt());
}
if (len == 1) {
System.out.println(0);
} else {
while (len >= 2) {
int size=list.size();
int start=list.get(0);
int end=list.get(size-1);
//System.out.println(size+" "+start+" "+end);
if (start>end) {
int sum=list.get(size-2)+end;
list.remove(size-1);
list.remove(size-2);
list.add(size-2,sum);
handleTimes++;
len--;
}else if (start<end) {
int sum=start+list.get(1);
list.remove(0);
list.remove(0);
list.add(0, sum);
handleTimes++;
len--;
}else {
list.remove(size-1);
list.remove(0);
len-=2;
}
}
System.out.println(handleTimes);
}
}
}
比较到最后可能会出现65 123的情况,那么再操作一次就变成一个数了,那最终他还是一个回文数,所以无论怎样操作,都是一个回文数。
下面是别人的一种解法,值得借鉴。
import java.util.Scanner;
public abstract class Test17 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
System.out.println(solve(arr,n));
}
scan.close();
}
private static int solve(int[] arr, int n) {
int left = 0;
int right = n - 1;
int ans = 0;
while (left < right) {
if (arr[left] < arr[right]) {
arr[left + 1] += arr[left];
++left;
++ans;
}else if (arr[left] > arr[right]){
arr[right - 1] += arr[right];
--right;
++ans;
}else {
++left;
--right;
}
}
return ans;
}
}
如果对上述答案有疑惑或错误,或者你有更好的方法,欢迎指出交流,共同进步!