网易-回文序列
来源:互联网 发布: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;
}
}
- 网易-回文序列
- [网易]回文序列
- 网易笔试题:回文序列
- 网易笔试题:回文序列
- 回文序列-2017网易校园招聘
- 网易真题之回文序列
- 网易2017校园招聘笔试题 回文序列
- 网易2017校园招聘笔试题:回文序列
- 网易2017校园招聘笔试题:回文序列
- 网易秋招编程题——回文序列
- 网易2017校园招聘笔试题 回文序列
- 网易编程题一,回文序列(贪心法)
- 回文序列(网易2017秋招编程题)
- 网易2017秋招编程题----回文序列
- 网易2017秋招编程题:回文序列 [python]
- [网易]字符串回文分割
- 网易 统计回文
- [网易]字符串回文分割
- Python中的打开文件对话框(转)
- 最全的webpack入门
- MySQL存储过程详解 mysql 存储过程
- JavaScript-ES6中的箭头函数(Arrow Function)
- android 魅族手机常见的问题
- 网易-回文序列
- React Native真机运行 ios
- Serializable和Externalizable
- 基于WPAD的中间人攻击
- HTML5开发之通过文件对象选择文件
- 函数式编程( Functional)与命令式编程( Imperative)对比
- 【MyEclipse安装配置教程】三、配置SVN
- 升级CocoaPods 1.0.0问题解决汇总
- 解决 打包成功后的apk安装后点击进入程序报"程序异常"然后闪退的错误