1. 程式人生 > >攜程2019實習生後臺開發筆試題 總結

攜程2019實習生後臺開發筆試題 總結

題目1:

給定一個整數的陣列,要求將陣列中的所有的0元素移動到陣列的最後,其他的元素保持原來的順序。

要求:空間複雜度不能超過O(1)

example:

給定陣列[0,2,0,7]轉換後應為[2,7,0,0]

輸入:

第一行輸入一個數組的長度

其他的數為陣列中元素。

法1 :

分析:該題目的難點在於將非0的元素移動到陣列的前端的時候必須要保持陣列原來元素的順序。我們可以看出0元素是確定的元素,我們可以統計0元素的個數之後,我們其他的元素向前移動的時候就可以將0覆蓋。

package com.duoduo.day330;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String [] args) {
		Scanner sc=new Scanner(System.in);
		int  n=sc.nextInt();         //陣列長度
		int [] arr=new int[n];
		for(int i=0;i<n;i++) {
			arr[i]=sc.nextInt();
		}
		moveZeroElement(arr);
	}

	/*將元素0全部移動至最後*/
	private static void moveZeroElement(int[] arr) {
		if(arr==null || arr.length<=0)      //必不可少的輸入判斷
			return;
		int count=0;   						//統計元素0的個數
		for( int s:arr) {
			if(s==0)
				count++;
		}
		int zeroIndex=arr.length-count;    //新陣列0開始的位置
		for(int i=0;i<zeroIndex;i++) {     //在此之前  以非零元素 前移 去替換0元素
			if(arr[i]==0) {                //確定0元素位置
				int j=i+1;
				while(arr[j]==0)           //尋找0元素之後的非零元素 位置
					j++;
				arr[i]=arr[j];             //以 非0元素  覆蓋 0元素
				arr[j]=0;
			}
		}
		for(int i=zeroIndex;i<arr.length;i++) {
			arr[i]=0;
		}
		
		System.out.println(Arrays.toString(arr));
		}
}

法2 :暴力做法

import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String [] args) {
		Scanner sc=new Scanner(System.in);
		int  n=sc.nextInt();         //陣列長度
		int [] arr=new int[n];
		for(int i=0;i<n;i++) {
			arr[i]=sc.nextInt();
		}
		moveZeroElement(arr);
	}

	public static void moveZeroElement(int [] arr) {
		if(arr==null || arr.length<=0)
			return;
		int count=0;
		for(int s:arr) {                               //0元素的個數
			if(s==0)
				count++;
		}
		for(int i=0;i<arr.length;i++) {
			if(arr[i]!=0)                        //列印全部非0元素
				System.out.print(arr[i]+" ");
		}
		
		for(int i=0;i<count;i++) {               //再列印剩下的0元素 到陣列末尾
			System.out.print("0 ");
		}
		System.out.println();
	}

法3 :(喜歡最後一個的思路)

	/*將非0元素前移  剩下的補0即可*/
	public static void moveZeroElement(int[] arr) {
		if(arr==null || arr.length<=0)
			return;
		int len=arr.length;
		int count=0;
		for(int i=0;i<len;i++) {
			if(arr[i]!=0) 
				arr[count++]=arr[i];    //非0元素從開頭計數儲存
		}
		
		for(int i=count;i<len;i++) {            //非0元素開始到陣列結束補0
			arr[i]=0;
		}
		
	}

題目2 : 有一個NxN整數矩陣,請編寫一個演算法,將矩陣順時針旋轉90度。 

給定一個NxN的矩陣,和矩陣的階數N,請返回旋轉後的NxN矩陣,保證N小於等於300。

方法1 :一步到位  

package com.duoduo.day330;
import java.util.Scanner;


public class Main2 {
	public static void main(String [] args) {
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();        //讀 取一行的字串 並自動換行
		String[] str1=str.split(" ");    //切割字串--陣列
		int N=str1.length;               //矩陣長度N
		int[][] arr=new int[N][N];       //新建陣列
		for(int i=0;i<N;i++) {
			 arr[0][i]=Integer.valueOf(str1[i]);    
		}
		
		for(int i=1;i<N;i++) {
			String strr=sc.nextLine();  
			String[] str2=strr.split(" ");
			for(int j=0;j<N;j++) {
				arr[i][j]=Integer.valueOf(str2[j]);
			}
		}
		
		int[][] temp=rotate(arr); 
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				System.out.print(temp[i][j]+" ");
			}
			System.out.println();
		}
		
	}


	/*一步到位 增加輔助陣列  arr[i][j] ---->arr[j][k]  k=len-1 開始k--*/
	private static int[][] rotate(int[][] arr) {
		if(arr==null)                        //判斷輸入合法
			return null;
		int len1=arr.length;
		int len2=arr[0].length;
		int [][]temp=new int [len2][len1];
		int k=len2-1;
		for(int i=0;i<len1;i++,k--) {
			for(int j=0;j<len2;j++) {
				temp[j][k]=arr[i][j];
			}
		}
		return temp;
	}
}


方法2:先轉置再逆序


package com.duoduo.day330;
import java.util.Scanner;

public class Main2 {
	public static void main(String [] args) {
		Scanner sc=new Scanner(System.in);
//		if(sc.next()==" ")   //增加邊界情況
//			return;
		String str=sc.nextLine();        //讀 取一行的字串 並自動換行
		String[] str1=str.split(" ");    //切割字串--陣列
		int N=str1.length;               //矩陣長度N
		int[][] arr=new int[N][N];       //新建陣列
		for(int i=0;i<N;i++) {
			 arr[0][i]=Integer.valueOf(str1[i]);    
		}
		
		for(int i=1;i<N;i++) {
			String strr=sc.nextLine();  
			String[] str2=strr.split(" ");
			for(int j=0;j<N;j++) {
				arr[i][j]=Integer.valueOf(str2[j]);
			}
		}
		
		rotate(arr); 
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
		
	}

	/*先轉置 再逆序   */
	private static void rotate(int[][] arr) {
		if(arr==null)                            //判斷輸入合法
			return ;
		int len=arr.length;
		int len2=arr[0].length;
		//轉置  沿主對角線對稱位置上的元素進行交換   
		//在原陣列上操作 即交換  否則 輔助陣列 arr[i][j]=a[j][i] 
		for(int i=0;i<len;i++) {
			for(int j=0;j<i;j++) {            //半個二維矩陣進行交換
				int temp=arr[i][j];
				arr[i][j]=arr[j][i];
				arr[j][i]=temp;
			}
		}
		
		//逆序   對一維陣列而言,將每一行第i個元素與第N-i-1個元素進行交換
		for(int i=0;i<len;i++){
			for(int j=0;j<len2/2;j++) { 
				int temp=arr[i][j];
				arr[i][j]=arr[i][len2-j-1];
				arr[i][len2-j-1]=temp;
			}
		}
	}
}