网易-回文序列

来源:互联网 发布:java base64编码 编辑:程序博客网 时间:2024/06/06 04:31

网易回文序列

 

牛客网网易题目:

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

 

 

   题目分析思路:

   回文序列是一种对称序列,所以回文序列只能有三种形式:

1:对分 左右完全对称,123321;总个数为偶数;

 

 

 

2:三分 以中间作为一种对称,1234321,总个数为基数;

3:最后一种为只有一个数 只有一个数 如2,这个其实可以划分为第二种情况

 

 

  如何将不是对称(回文)序列通过两两合并成一个回文序列

1 给一个整数数组a[N],求所有整数序列的总和,然后除以2,

结果为整数则说明有可能为二分,i=0,count=0然后比较sum1=a[i]sum2=a[N-i]

(1)Sum1==sum2,i++;在进行比较,再令sum1=a[i]sum2=a[N-i]

(2)Sum1<sum2,sum1=sum1+a[++i];count++;

(3)Sum1>sum2,sum2=sum2+a[n-(++i)];count++

知道i==(n/2-1),sum1==sum2,则证明可以转换成回文序列,返回count否则证明此序列不能转换成二分回文序列,需要整个数组合成一个数,则返回count=n-1;

   结果为小数,则证明可能为三分数列,同样如上述:


i=0,count=0然后比较sum1=a[i]sum2=a[N-i]

(4)Sum1==sum2,i++;在进行比较,再令sum1=a[i]sum2=a[N-i]

(5)Sum1<sum2,sum1=sum1+a[++i];count++;

(6)Sum1>sum2,sum2=sum2+a[n-(++i)];count++

知道i==(n/2-1),sum1==sum2,则证明可以转换成回文序列,返回count否则证明此序列不能转换成二分回文序列,需要整个数组合成一个数,则返回count=n-1;

 

以上分析到此为止,只适合整数序列并不适合小数序列:

下面附上程序:

 

 

public class Huiwen {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

//int[] a={1 ,1,1,2,1,6,3, 3,6};检验中分

int[] a={3,1,2,6,8,4,4,4};  //检验三分

System.out.println(huiwen(a,a.length));

}

public static int huiwen(int[] a,int length){

int[] b=new int[length];

int sum=0;

int sum2=0;

//int sum3=0;

for(int i=0;i<length;i++){

sum+=a[i];

}

System.out.println("总和为:"+sum);

int zhongjian=0; //对分

int zhongjian2=0;//三分

for(int k=0;k<length;k++){

if(sum2+a[k]==sum/2){

zhongjian=k;

System.out.println("中分位置为:"+zhongjian);

break;

}if(sum2+a[k]>sum/2)

{

zhongjian2=k;

System.out.println("三分位置为:"+zhongjian2);

break;

}

sum2+=a[k];

}

int b1=0;// b数组下标

int b2=0;  //累加次数

int sum3=a[0];

int sum4=a[length-1];

if(zhongjian!=0){

System.out.println("对分进来  中间为:"+zhongjian);

for(int k=0, m=length-1;k<=zhongjian&&m>zhongjian;){

//if(a[k]==a[m]){b[b1]=a[k];k++;m--;}

if(sum3==sum4){

System.out.println(sum3+"="+sum4+"  k下标为:"+k+"  m下标为:"+m );

k++;

m--;

sum3=a[k];

sum4=a[m];

 System.out.println("continue之前"+"  k下标为:"+k+"  m下标为:"+m );

continue;

}

if(sum3>sum4){

System.out.println(sum3+":"+sum4);

sum4=sum4+a[m];

m--;

System.out.println("m--");

b2++;

System.out.println("b2++<<<");

}else if(sum3<sum4){

System.out.println(sum3+":"+sum4);

sum3=sum3+a[k];

b2++;

k++;

    System.out.println("b2++>>>");

}

}

return b2;

}

 sum3=a[0];

sum4=a[length-1];

if(zhongjian2!=0){

System.out.println("对分进来  中间位置zhongjian2:"+zhongjian2);

for(int k=0, m=length-1;k<zhongjian2&&m>zhongjian2;){

//if(a[k]==a[m]){b[b1]=a[k];k++;m--;}

System.out.println("循环开始sum3:sum4="+sum3+" :"+sum4);

if(sum3==sum4){

System.out.println(sum3+"="+sum4+"  k下标为:"+k+"  m下标为:"+m );

k++;

m--;

sum3=a[k];

sum4=a[m];

 System.out.println("continue之前"+"  k下标为:"+k+"  m下标为:"+m );

continue;

}

if(sum3>sum4){

//System.out.println(sum3+":"+sum4);

if(m==length-1){

m--;

}

sum4=sum4+a[m];

m--;

System.out.println("m--");

b2++;

System.out.println("b2++<<<");

}else if(sum3<sum4){

//System.out.println(sum3+":"+sum4);

if(k==1){

k++;

}

sum3=sum3+a[k];

b2++;

k++;

    System.out.println("b2++>>>");

}

System.out.println("循环结束时sum3:sum4="+sum3+" :"+sum4);

}

if(sum3==sum4)

return b2;

else 

return length-1;

}

return (Integer) length-1;

}

 

}

 

 

 

 

 

 

0 0
原创粉丝点击