攜程2019實習生後臺開發筆試題 總結
阿新 • • 發佈:2019-01-07
題目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;
}
}
}
}