1. 程式人生 > >常考面試算法題之暴力枚舉

常考面試算法題之暴力枚舉

數量 int i++ 字符串長度 變換 div stat length hsi

結合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代碼實現

常考面試算法題之暴力枚舉