实战编程-回文序列
2017-03-03 10:06
127 查看
编程要求
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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
check方法用于检测数组是否符合回文序列的规则,把数组从中间分开,然后头尾比较,如果全部相等,就说明符合回文序列的规则。
回文序列的可以简单能理解为头尾相等,根据编程要求,把两个相邻的数值相加放回原位,操作多次,使得数组符合回文序列。
我们只要判断头尾是否相等,就能知道是否执行相加操作,如果相等我们可以掐头去尾以后再进行比较,直到满足要求。
如果头尾不相等,我们就需要进行相加操作,那是从头部开始加呢,还是从尾部开始加呢,就要比较两个数字的大小,哪边小就从哪边进行相加操作,这样才可能和大的一方相等,如果对大的一方进行相加操作,则永远不会等于小的一方,就会导致计算结果有误。
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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
import java.util.Scanner; public class Main { static int count = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int length = scanner.nextInt(); int[] array = new int[length]; for (int i = 0; i < array.length; i++) { array[i] = scanner.nextInt(); } add(array); System.out.println(count); } public static void add(int[] array) { int length = array.length; int head = array[0]; int foot = array[length - 1]; if (head == foot) { if (!check(array)) { int[] arr = new int[length - 2]; for (int i = 0; i < arr.length; i++) { arr[i] = array[i + 1]; } add(arr); } } else { count++; 4000 int[] arr = new int[length - 1]; if (head > foot) { for (int i = 0; i < arr.length; i++) { arr[i] = array[i]; if (i == length - 2) arr[i] += array[i + 1]; } } else { for (int i = 0; i < arr.length; i++) { arr[i] = array[i+1]; if (i == 0) arr[i] += array[i]; } } add(arr); } } public static boolean check(int[] array) { int length = array.length; int half = length / 2; for (int i = 0; i < half; i++) { if (array[i] != array[length - i - 1]) { return false; } } return true; } }
check方法用于检测数组是否符合回文序列的规则,把数组从中间分开,然后头尾比较,如果全部相等,就说明符合回文序列的规则。
回文序列的可以简单能理解为头尾相等,根据编程要求,把两个相邻的数值相加放回原位,操作多次,使得数组符合回文序列。
我们只要判断头尾是否相等,就能知道是否执行相加操作,如果相等我们可以掐头去尾以后再进行比较,直到满足要求。
如果头尾不相等,我们就需要进行相加操作,那是从头部开始加呢,还是从尾部开始加呢,就要比较两个数字的大小,哪边小就从哪边进行相加操作,这样才可能和大的一方相等,如果对大的一方进行相加操作,则永远不会等于小的一方,就会导致计算结果有误。
相关文章推荐
- 编程之美资格赛——题目2 : 回文字符序列
- Java在线笔试编程(3)---计算回文序列
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
- 每日编程系列——回文序列
- 【编程之美】题目2 : 回文字符序列
- 网易2017秋招编程题----回文序列
- 2015编程之美 回文字符序列(区间Dp)
- 回文序列--网易2017秋招模拟考编程题1
- SmartPhone 2003 手机编程实战之二:自己开发一个天气预报服务
- 多线程编程 实战篇 (三)
- C#多线程编程实例实战
- 实战Visual C#数据库编程
- 实战体会Java多线程编程的精要
- 简单直观-实战体会Java多线程编程的精要 (5)
- C#多线程编程实例实战
- 多线程编程 实战篇 (一)
- Html和JavaScript编程实战!
- 多线程编程 实战篇 (五)
- 简单直观-实战体会Java多线程编程的精要 (1)
- 简单直观-实战体会Java多线程编程的精要 (3)