1. 程式人生 > >筆試實踐2---2017年網易線上筆試之程式設計題

筆試實踐2---2017年網易線上筆試之程式設計題

選取是3個題目中的第3題,題目是這樣的:

如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如: 
{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

以下是我自己的答案,僅供參考,因為當時在做的時候,思維混亂了,一心想著把3題都完成,沒沉住氣,亂了,沒寫出來,於是今天早上來重寫了下,大約半小時就好了。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public  class Main{

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int len=scan.nextInt();
		List<Integer> list = new ArrayList<Integer>();
		int handleTimes = 0;
		for (int i = 0; i < len; i++) {
			list.add(scan.nextInt());
		}
		if (len == 1) {
			System.out.println(0);
		} else {
			while (len >= 2) {
				int size=list.size();
				int start=list.get(0);
				int end=list.get(size-1);
				//System.out.println(size+" "+start+" "+end);
               if (start>end) {
            	  int sum=list.get(size-2)+end;
            	  list.remove(size-1);
            	  list.remove(size-2);
            	  list.add(size-2,sum);
				  handleTimes++;
				  len--;
					
			   }else if (start<end) {
				  int sum=start+list.get(1);
				  list.remove(0);
				  list.remove(0);
				  list.add(0, sum);
				  handleTimes++;
				  len--;
				
			   }else {
				   list.remove(size-1);
				   list.remove(0);
				   len-=2;
			   }
			}
			System.out.println(handleTimes);
		}
	}
}

比較到最後可能會出現65 123的情況,那麼再操作一次就變成一個數了,那最終他還是一個迴文數,所以無論怎樣操作,都是一個迴文數。

下面是別人的一種解法,值得借鑑。

import java.util.Scanner;

public abstract class Test17 {

	public static void main(String[] args) {
	   Scanner scan = new Scanner(System.in);
             while (scan.hasNext()) {
                    int n = scan.nextInt();
	            int[] arr = new int[n];
	            for (int i = 0; i < n; i++) {
	                arr[i] = scan.nextInt();
	            }
	            System.out.println(solve(arr,n));
	        }
	        scan.close();
	
	}
	 private static int solve(int[] arr, int n) {
	        int left = 0;
	        int right = n - 1;
	        int ans = 0;
	        while (left < right) {
	            if (arr[left] < arr[right]) {
	                arr[left + 1] += arr[left];
	                ++left;
	                ++ans;
	            }else if (arr[left] > arr[right]){
	                arr[right - 1] += arr[right];
	                --right;
	                ++ans;
	            }else {
	                ++left;
	                --right;
	            }
	        }
	        return ans;
	    }
}




如果對上述答案有疑惑或錯誤,或者你有更好的方法,歡迎指出交流,共同進步!