常考面试算法题之暴力枚举

结合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代码实现

原文地址:https://www.cnblogs.com/zdmein/p/8286759.html

时间: 2024-11-04 14:34:05

常考面试算法题之暴力枚举的相关文章

一道看似非常难的面试算法题

这是昨天面试百度时碰到的一道算法题:任意数分三组,使得每组的和尽量相等.由于时间仓促,加之面试时头昏脑涨,这道题没做出来甚至没有给出思路,这让我多少有些遗憾和不甘.因为最近接触算法的东西较多而且本身对算法感兴趣,所以回家之后绞尽脑汁想把这题做出来.其实刚看到这题时感觉不难,但是因为数字个数及数值的不确定,我感觉这题越想越难.昨天一晚上没有睡好,甚至做梦都在想这题! 今天上午在多个群里问了这题,都没有给出思路,真是绝望至极.很多人都说 n/3 的思路,其实这种思路一开始就是死胡同.本人属于那种不会

面试算法题:爬楼梯,N级楼梯有多少种走法?

By Long Luo 个人博客链接 最近去面试时,在一家小公司面试时,公司小BOSS给我出了一道算法题: 一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,要求编写程序,求总共有多少种走法. 这个问题应该是一个很老的题目了,用中学数学来说,就是一个排列组合问题.当时拿到这个题目之后,首先想到使用递归的思想去解决这个问题: N级楼梯问题可以划分为:N-1级楼梯,N-2级楼梯,N-3级楼梯的走法之和. 先计算下0,1,2,3及楼梯有多少种走法: 1 --> 1 2 --> 11 2

面试常考排序算法

//直接插入排序 void InsertSort(int A[], int n) { int i,j; int temp; for (i=0;i<n-1;i++) { temp=A[i+1]; j=i; while (j>-1&&temp<A[j]) { A[j+1]=A[j]; j--; } A[j+1]=temp; } } //冒泡排序 void BubbleSort(int A[],int n) { int i, j, flag=1; int temp; for (

远景面试算法题——FolderSize

描述 文件被存储在磁盘上的时候,通常为cluster方式.每个cluster具有固定的大小,一个文件所消耗的空间量始终是cluster大小的整数倍.因此,如果cluster的大小为100字节,165字节的文件将会使用实际使用200字节的存储空间,造成35个空间的浪费. 一个folder会有多个file,每个file单独计算浪费空间:如果某个folder没有出现,浪费空间为0 定义 Method signature: int[] calculateWaste(String[] files, int

偶然看到的面试算法题_最短时间找出十包粉末中的两蓝粉末。

题目:有4个杯子,10包粉末,其中有2包溶于水变蓝,其余无色,粉末溶于水2min才能显现颜色.求找出两包蓝色粉末的最短时间.假设水和粉末用不完. 解:以下给出四种解法,标记10包粉末为(1,2 ... ) 杯子为[1,2,3,4]首先我想会不会是有某种算法,dp 二分..@[email protected]..没有,懵懵的. 法一:这是我最初想到的比较傻的方法 第一趟:[12,34,56,78] 每个杯子分别放两包加水融化,剩下两包不管.可能的情况: (1)0个杯子变色,说明剩下两包就是蓝粉末

百度面试算法题

1.代码编译过程 在cpp文件中展开include文件. 将每个cpp文件编译为一个对应的obj文件. 连接obj文件成为一个exe文件(或者其它的库文件) 2.100W个整数中求最小的k个数,有哪些方法,优缺点 快速排序: 分区时,根据数P将数组分为两部分,设大于P的数个数为a,小于P的数的个数为b.如果,a>=k,则从这a个数取最大的k个数,若a<k,则从b个数取最大的k-a-1个. 3.两个10G的文件中,求含有相同整数,有哪些方法,优缺点 (1)快排+二分查找 (2)位图法 位图法的应

实习生面试--算法题之一

题目:在整型数中只有1位是1,求1在整型数中的位置? 通常,面试者给的答案是一位一位的右移,并判断是否移位后的值是1,如果是1,输出被移位的位数就是我们要的答案了. 但是这并不是最优的答案,时间复杂度是O(n).那么更好的算法是什么样的呢,其实我们可以采用二分法更高效的解决本问题,时间复杂度是O(logn). 下面给出代码,并测试时间消耗. 算法1 1 int scan(unsigned int value) 2 { 3 int len = sizeof (unsigned int) * 8;

[面试算法题重做]翻转句子中单词的顺序

话说工作中算法用的真的多么?????? 虽然工作中用不到,但是你总得换工作吧,防不住笔试面试中问你些这么个玩意. 而且,多思考,有助于活跃头脑了.深深扎入项目中童鞋们还可以活跃活跃,防止生锈. 话不多说,题目如下: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“student. a am I”. 在何海涛的日记中,分析方法是 先颠倒句子中的所有字符.这时,

实习生面试--算法题之字符串最长公共子序列长度

题目:求两字符串的最长公共子序列的长度. 题外话:最长公共子串,子序列问题是被充分讨论的问题,网上一搜一大把,请bing之. 本题只要求求最长公共子序列的长度,而不需要记录最长的公共子序列,给予了我们便利,请参考代码: 1 int max(int a, int b) 2 { 3 return a > b ? a : b; 4 } 5 6 int lcs(char* str1, char* str2) 7 { 8 if (str1 == nullptr || str2 == nullptr) 9