结合 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
输入
1
1
1 12
输出DNA 合成
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 分子是以 4 种脱氧核苷酸为单位连接而成的长链,这 4 种脱氧核苷酸分别含有 A,T,C,G 四种碱基.碱基互补配对原则:A 和 T 是配对的,C 和 G 是配对的.如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为 DNA 的双螺旋结构.现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基.问最少需要多少次让两条碱基链配对成功
输入描述:
输入包括一行:
包括两个字符串, 分别表示两条链, 两个字符串长度相同且长度均小于等于 50.
输出描述:
输出一个整数,即最少需要多少次让两条碱基链配对成功
示例 1
输入
TGCA
ACGT
输出连续整数
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
输入
3 6
2
输出序列和
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 代码实现
来源: http://www.bubuko.com/infodetail-2461744.html