活动地址:CSDN21天学习挑战赛
JAVA面试练习题刷题记录
目录
一、生成格雷码
二、微信红包
三、编码
四、游戏任务标记
五、素数对
总结
我几乎每天都会刷题训练来使自己对各种算法随时保持一个清晰的状态。要知道眼过千遍不如手过一遍,想成为一名合格的开发工程师,更要逼迫自己养成动手的好习惯。
我们都知道,算法的训练对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,刷算法最最最直白的原因就是找一个好的工作,那刷题一定是必不可少的。
现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网
相较于其他平台,他们的题单更和工作,大厂靠拢,不光有面试必刷的101到题目,还有大量大厂真题,内容也全程免费,相较于其它会员费结算的来说 非常的友好。
牛客网还支持ACM模式,没有练习过的一定要提前适应!像某团、某为,都要求自己处理输入输出,如果不提前练习会很吃亏的!
牛客的题解更新迭代也很快,讨论区也有技巧的分享,能帮你把所有盲点扫清楚,整体来说还是非常推荐去练习的~
传送门: 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
测试样例:
1返回:["0","1"]
题解:
import java.util.*;
public class GrayCode {
public String[] getGray(int n) {
// write code here
String[] ans = new String[(int) Math.pow(2, n)];
ans[0] = "0";
ans[1] = "1";
int len = 2, len2 = len << 1;
for(int i = 1; i < n; i++) {
for(int j = len; j < len2; j++) {
ans[j] = "1" + ans[len - 1 - j + len];
}
for(int j = 0; j < len; j++) {
ans[j] = "0" + ans[j];
}
len = len2;
len2 = len << 1;
}
return ans;
}
}
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组 gifts 及它的大小 n ,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
数据范围: 1≤n≤1000 1 \le n \le 1000 \ 1≤n≤1000 ,红包金额满足 1≤gifti≤100000 1 \le gift_i \le 100000\ 1≤gifti≤100000
示例1
输入:
[1,2,3,2,2],5返回值:
2示例2
输入:
[1,1,2,2,3,3],6返回值:
0
题解:
import java.util.*;
public class Gift {
public int getValue(int[] gifts, int n) {
Map m = new HashMap<>();
for(int i = 0; i < gifts.length; ++i){
if(m.containsKey(gifts[i])){
m.put(gifts[i], m.get(gifts[i]) + 1);
}else{
m.put(gifts[i], 1);
}
if(m.get(gifts[i]) > gifts.length/2){ //超过一半就返回
return gifts[i];
}
}
return 0;
}
}
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.
输入一个待编码的字符串,字符串长度小于等于100.
输出这个编码的index
示例1
输入:
baca输出:
16331
题解:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Comparator;
class CodeComparator implements Comparator {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
public class Main {
private static ArrayList list = new ArrayList<>();
private static String[] strArr = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y"};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println(getPos(in.nextLine()));
}
//装值
public static void setVal(){
//1个
ArrayList list0 = new ArrayList<>();
for(int i=0; i
游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态都是未完成。 输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。 输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。
输入包括一行,两个整数表示任务ID.
输出是否完成
示例1
输入:
1024 1024输出:
1
题解:
import java.util.Scanner;
/**
* 用32个int记录1024个任务状态,任务ID为1~1024,任务初始状态都是未完成
* 函数功能:输入两个任务ID,将第一个任务设为已完成,并检测第二个任务是否已完成(完成返回1,未完成返回0)
*
* 32个int,每个int32位,共32*32=1024位,刚好每一位表示一个任务的状态
*/
public class T4GameTaskTag {
public static void main(String[] args) {
//tasks[0]:1~32号任务 tasks[1]:33~64号任务
int[] tasks = new int[32];
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) { // 注意 while 处理多个 case
int id1 = in.nextInt();
int id2 = in.nextInt();
System.out.println(setAndCheck(tasks, id1, id2));
}
}
public static int setAndCheck(int[] tasks, int id1, int id2) {
if (!checkInParams(id1, id2)) {
return -1;
}
//任务在tasks[n] 0~31
int n = (id1 - 1) / 32;
//设置id1的任务为已完成
int bit = (id1 - 1) % 32;
tasks[n] = tasks[n] | (1 << bit);
//检查id2的任务是否已完成
int n2 = (id2 - 1) / 32;
int bit2 = (id2 - 1) % 32;
//使用无符号右移:由于java没有无符号数
return (tasks[n2] & (1 << bit2)) >>> bit2;
}
private static boolean checkInParams(int id1, int id2) {
boolean b1 = id1 >= 1 && id1 <= 1024;
boolean b2 = id2 >= 1 && id2 <= 1024;
return b1 && b2;
}
}
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入包括一个整数n,(3 ≤ n < 1000)
输出对数
示例1
输入:
10输出:
2
题解:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List v = new ArrayList<>();
for(int i = 2; i < n; ++i) if(f(i)) v.add(i);//先求出1~n之间的所有素数
int r = 0;
boolean[] visit = new boolean[v.size()];//标记该素数是否已访问
for(int i = 0; i < v.size(); ++i){
if(!visit[i] && v.contains(n - v.get(i))){//做差,另一个也是质数
r++;
visit[i] = true;
visit[v.indexOf(n - v.get(i))] = true;//把这俩都标记已访问
}
}
System.out.println(r);
}
static boolean f(int n){//求素数的函数,可以用欧拉筛法加速
if(n <= 1) return false;
if(n == 2) return true;
for(int i = 2; i < n; ++i){
if(n%i == 0) return false;
}
return true;
}
}
点击链接 进行跳转注册,开始你的保姆级刷题之路吧!
另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等
3、语言篇(500题):C/C++、java、python入门算法练习
4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!