回文序列(网易)
題目描述
如果一個數字序列逆置之后跟原序列是一樣的就稱這樣的數字序列為回文序列。例如:
{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
輸入
4 1 1 1 3
輸出
2
分析:
回文從兩端看一一對應相等,所以從兩端開始比較,有不相同的就將小者相鄰元素相加。
用兩個指針,分別指向開頭和結尾,如果有前面的小,則將前面的元素和它后一個元素相加放到它后一個元素的位置,然后前指針后移一個繼續判斷。
如果后面元素大,則將后面元素和它前面一個元素相加放到它前面元素的位置。一直下去,到最后只有一個元素(是回文)位置。
import java.util.*;
public class Main{
/*
用兩個指針,分別指向開頭和結尾,如果有前面的小,則將前面的元素和它后一個元素相加放到它后一個元素的位置,然后前指針后移一個繼續判斷。
如果后面元素大,則將后面元素和它前面一個元素相加放到它前面元素的位置。一直下去,到最后只有一個元素(是回文)位置。
*/
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] num=new int[n];
for(int i=0;i<n;i++){
num[i]=sc.nextInt();
}
int count=0;
int start=0,end=n-1;
while(start<end){
if(num[start]<num[end]){
num[start+1]=num[start]+num[start+1];
start++;
count++;
}else if(num[start]>num[end]){
num[end-1]=num[end]+num[end-1];
end--;
count++;
}else{
start++;
end--;
}
}
System.out.println(count);
}
}
}
總結
- 上一篇: 相关性检验
- 下一篇: ABAQUS提交inp求解的几种方法