常考面試算法題之暴力枚舉
結合2017春招和秋招真題,以下幾類算法題最常考,匯總了一下:
好多魚!
牛牛有一個魚缸。魚缸裏面已經有n條魚,每條魚的大小為fishSize[i] (1 ≤ i ≤ n,均為正整數),牛牛現在想把新捕捉的魚放入魚缸。魚缸內存在著大魚吃小魚的定律。經過觀察,牛牛發現一條魚A的大小為另外一條魚B大小的2倍到10倍(包括2倍大小和10倍大小),魚A會吃掉魚B。考慮到這個,牛牛要放入的魚就需要保證:
1、放進去的魚是安全的,不會被其他魚吃掉
2、這條魚放進去也不能吃掉其他魚
魚缸裏面已經存在的魚已經相處了很久,不考慮他們互相捕食。現在知道新放入魚的大小範圍minSize,maxSize,牛牛想知道有多少種大小的魚可以放入這個魚缸。
輸入描述:
輸入數據包括3行.
第一行為新放入魚的尺寸範圍minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。
第二行為魚缸裏面已經有魚的數量n(1 ≤ n ≤ 50)
第三行為已經有的魚的大小fishSizei,以空格分隔。
輸出描述:
輸出有多少種大小的魚可以放入這個魚缸。考慮魚的大小都是整數表示
示例1
輸入
1 12
1
1
輸出
3
import java.util.Random; import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("minSize :"); int minSize = scanner.nextInt(); System.out.println("maxSize :"); int maxSize = scanner.nextInt(); System.out.println("inNumber :"); int inNumber = scanner.nextInt(); System.out.println("inFishSize[ ] :"); int [] inFishSize = new int[inNumber]; for(int i=0;i<inNumber;i++) { inFishSize[i]=scanner.nextInt(); } int count =0; for(int i=minSize;i<=maxSize ;i++){ boolean flag=false; for(int j=0;j<inNumber ;j++){ if(( i*2<=inFishSize[j]&&inFishSize[j]<=i*10 )||( inFishSize[j]*2<=i && inFishSize[j]*10>=i )){ flag=true; break; } } if(!flag){ count++; } } System.out.println(count); } }
DNA合成
DNA分子是以4種脫氧核苷酸為單位連接而成的長鏈,這4種脫氧核苷酸分別含有A,T,C,G四種堿基。堿基互補配對原則:A和T是配對的,C和G是配對的。如果兩條堿基鏈長度是相同的並且每個位置的堿基是配對的,那麽他們就可以配對合成為DNA的雙螺旋結構。現在給出兩條堿基鏈,允許在其中一條上做替換操作:把序列上的某個位置的堿基更換為另外一種堿基。問最少需要多少次讓兩條堿基鏈配對成功
輸入描述:
輸入包括一行:
包括兩個字符串,分別表示兩條鏈,兩個字符串長度相同且長度均小於等於50。
輸出描述:
輸出一個整數,即最少需要多少次讓兩條堿基鏈配對成功
示例1
輸入
ACGT
TGCA
輸出
0
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("輸入堿基s1 :"); String s1=scanner.nextLine(); System.out.println("輸入堿基s2 :"); String s2= scanner.nextLine(); if(s1.length()!=s2.length()||s1.isEmpty()||s2.isEmpty()){ return; } int count =0; for(int i=0;i<s1.length();i++){ if(!( (s1.charAt(i)==‘A‘ && s2.charAt(i)==‘T‘) || (s2.charAt(i)==‘A‘ && s1.charAt(i)==‘T‘) || (s1.charAt(i)==‘C‘ && s2.charAt(i)==‘G‘) || (s2.charAt(i)==‘C‘ && s1.charAt(i)==‘G‘) )){ count++; } } System.out.println(count); } }
連續整數
牛牛的好朋友羊羊在紙上寫了n+1個整數,羊羊接著抹除掉了一個整數,給牛牛猜他抹除掉的數字是什麽。牛牛知道羊羊寫的整數神排序之後是一串連續的正整數,牛牛現在要猜出所有可能是抹除掉的整數。例如:
10 7 12 8 11 那麽抹除掉的整數只可能是9
5 6 7 8 那麽抹除掉的整數可能是4也可能是9
輸入描述:
輸入包括2行:
第一行為整數n(1 <= n <= 50),即抹除一個數之後剩下的數字個數
第二行為n個整數num[i] (1 <= num[i] <= 1000000000)
輸出描述:
在一行中輸出所有可能是抹除掉的數,從小到大輸出,用空格分割,行末無空格。如果沒有可能的數,則輸出mistake
示例1
輸入
2
3 6
輸出
mistake
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.println("剩下數字個數 :");
int n=scanner.nextInt();
int [] num=new int[n];
System.out.println("輸入剩下數字 :");
int max=Integer.MIN_VALUE;
int min=Integer.MAX_VALUE;
int s=0;
for(int i=0;i<n;i++){
num[i]=scanner.nextInt();
s+=num[i];
if(num[i]<min) min=num[i];
if(num[i]>max) max=num[i];
}
if(max-min+1 == n){
if(s==(max+min)*n/2){
if(min>1){
System.out.println((min-1)+" "+ (max+1));
}else {
System.out.println(max+1);
}
}else {
System.out.println("mistake!");
}
}else {
if(max-min==n){
for(int j=1;j<n;j++){
if(num[j]==num[j-1]){
System.out.println("mistake!");
}else if (num[j]==num[j-1]+2){
System.out.println(num[j]-1);
}
}
}else {
System.out.println("mistake!");
}
}
}
}
序列和
01翻轉
最長公共連續子串
組裝三角形
最小的矩形
字符串分類
優美的回文串
趕去公司
調整隊形
集合
塗棋盤
小易記單詞
分餅幹
買帽子
度度熊回家
尋找三角形
有趣的排序
神奇數
添加字符
數組變換
Java代碼實現
常考面試算法題之暴力枚舉