题目描述
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
{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),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
思路:
对于数字序列,分别使用两个索引(头索引left和尾索引right),从两头向中间靠拢,如果left索引处的值较小,将left索引处的数值叠加到后面的元素,同时将left索引往右移动,反复执行该操作直至大于等于right索引处的数值; 如果right索引处的值较小,将right索引处的数值叠加到前面的元素,同时将right索引往左移动,反复执行该操作直至大于等于left索引处的数值,在加的过程中,加的次数就是合并的次数,如果两个索引处的数值相等,两个索引同时向中间移动(left++,right--)。如果head大于等于tail,则回文序列构造成功。代码:
package com.example.shirodemo; import java.util.*; /** * Created by ASUS on 2018/7/3 * * @Authod Grey Wolf */ public class Practice { public static void main(String[] args) { Practice practice=new Practice(); practice.sys(); } private void sys() { Scanner sc=new Scanner(System.in); while (sc.hasNext()){ int n=sc.nextInt(); int []arr=new int[n]; int i; for (i=0;i<n;i++){ arr[i]=sc.nextInt(); } int res=0; //边界值 int left=0,right=n-1; while (left<right){ //先匹配前后是回文的位置 while (left<right&&arr[left]==arr[right]){ left++; right--; } //对不符合回文的位置进行操作 if (left<right){ if (arr[left]<arr[right]){ left++; arr[left]+=arr[left-1]; //转换次数加一 res++; }else if (arr[left]>arr[right]){ right--; arr[right]+=arr[right+1]; res++; } } } System.out.println("转换次数res-->"+res); } } }
效果:
4 1 1 1 3
转换次数res-->2
3 1 2 2
转换次数res-->2
4 1 2 2 3
转换次数res-->1
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。