常考面试算法题之暴力枚举
结合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)
第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。
输出描述:
输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
示例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代码实现