网易2017校园招聘笔试题:回文序列

来源:互联网 发布:阿里妈妈淘宝客推广 编辑:程序博客网 时间:2024/05/22 17:34

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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),以空格分隔。


输出描述:
输出一个数,表示最少需要的转换次数

输入例子:
41 1 1 3

输出例子:
2

[html] view plain copy
  1. package com.wangyi.xiaozhao;  
  2.   
  3. import java.util.Scanner;  
  4.   
  5. public class AnHeiZiFuChuan {  
  6.   
  7.     public static void main(String[] arg) {  
  8.         Scanner scan = new Scanner(System.in);  
  9.         while (scan.hasNext()) {  
  10.             int n = scan.nextInt();  
  11.             int[] arr = new int[n];  
  12.             for (int i = 0; i < n; i++) {  
  13.                 arr[i] = scan.nextInt();  
  14.             }  
  15.             System.out.println(solve(arr, n));  
  16.         }  
  17.         scan.close();  
  18.     }  
  19.   
  20.     private static int solve(int[] arr, int n) {  
  21.         int left = 0;  
  22.         int right = n - 1;  
  23.         int ans = 0;  
  24.         while (left < right) {  
  25.             if (arr[left] < arr[right]) {  
  26.                 arr[left + 1] += arr[left];  
  27.                 ++left;  
  28.                 ++ans;  
  29.             } else if (arr[left] > arr[right]) {  
  30.                 arr[right - 1] += arr[right];  
  31.                 --right;  
  32.                 ++ans;  
  33.             } else {  
  34.                 ++left;  
  35.                 --right;  
  36.             }  
  37.         }  
  38.         return ans;  
  39.     }  
  40.   
  41. }  
0 0