回文序列解题思路
2016-12-02 00:17
253 查看
网易校招的一道算法题提到了回文序列,原题如下:
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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),以空格分隔。
输出描述
针对这一道题,我们先从测试用例[1,1,1,3]出发,最差的情况是把相邻两个数一直相加,知道只剩下一个数,过程是
原始数据:[1,1,1,3]
第一步: [2,1,3]
第二步: [3,3]
第三步: [6]
观察过程可知,数据一直在向中间靠拢,实际上不用到第三步,第二步就已经是回文序列了,那么回文序列的标志是什么呢?通过观察可知头尾相等就是回文序列,那么如何通过 [和操作]这一个题目规定的操作来调整成文回文序列呢,就是比较头尾一起向中间移动,比较头部尾部大小,头部小了,执行头部相加操作;尾部小了,执行尾部相加操作;当符合回文序列时,停止计数。
现在来看看我们的实现代码(Java):
代码充分运用了上面的解题思路。
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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),以空格分隔。
输出描述
输出一个数,表示最少需要的转换次数
针对这一道题,我们先从测试用例[1,1,1,3]出发,最差的情况是把相邻两个数一直相加,知道只剩下一个数,过程是
原始数据:[1,1,1,3]
第一步: [2,1,3]
第二步: [3,3]
第三步: [6]
观察过程可知,数据一直在向中间靠拢,实际上不用到第三步,第二步就已经是回文序列了,那么回文序列的标志是什么呢?通过观察可知头尾相等就是回文序列,那么如何通过 [和操作]这一个题目规定的操作来调整成文回文序列呢,就是比较头尾一起向中间移动,比较头部尾部大小,头部小了,执行头部相加操作;尾部小了,执行尾部相加操作;当符合回文序列时,停止计数。
现在来看看我们的实现代码(Java):
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int times = 0; int n = scanner.nextInt(); int[] inputArr = new int ; for(int i = 0; i < n; i++){ inputArr[i] = scanner.nextInt(); } int head = 0; int tail = n - 1; while(head < tail){ if(inputArr[head] > inputArr[tail]){ inputArr[--tail] += inputArr[tail + 1]; times++; }else if(inputArr[head] < inputArr[tail]){ inputArr[++head] += inputArr[head - 1]; times++; }else{ head++; tail--; } } System.out.println(times); } scanner.close(); } }
代码充分运用了上面的解题思路。
相关文章推荐
- leetCode 9.Palindrome Number (回文数字) 解题思路和方法
- 序列中的最多除数问题(解题思路同样适用于最大递增序列)
- Combination Sum求和为给定值的所有序列的解题思路
- ACM解题之回文序列
- 浙大PAT 2-11. 两个有序链表序列的合并 (解题思路)
- 浙大PAT 2-12. 两个有序链表序列的交集 (解题思路)
- Combination Sum求和为给定值的所有序列的解题思路(续)
- 浙大PAT 2-13. 两个有序序列的中位数 (解题思路)
- leetCode 60.Permutation Sequence (排列序列) 解题思路和方法
- leetCode 115.Distinct Subsequences(子序列距离) 解题思路和方法
- 给初学编程解题没思路的学生的建议
- leetCode 89.Gray Code (格雷码) 解题思路和方法
- 回文字符串的判断解题报告
- 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路
- leetCode 48.Rotate Image (旋转图像) 解题思路和方法
- C语言经典题目及解题思路
- leetCode 78.Subsets (子集) 解题思路和方法
- 求给定字符串中最长回文序列
- 判断一个字符串是否能够通过添加一个字符变成回文序列的方法
- LeetCode Weekly Contest 32解题思路