2021秋招遇到的笔试题Java岗
⽂章⽬录
科⼤讯飞:Java开发
将num值⼆进制形式中第⼆位0改为1
题⽬:输⼊⼀个正整数,将其⼆进制第⼆位0改为1。例如:10=(1010)2,返回14=(1110)2。代码:
/**
* 将num⼆进制中第⼆位0改为1
* @param num [1,10^9]
* @return
*/
public static int changeNumber (int num) {
// 到num第⼆个0
int i=num;
int sum=0;
int twice=0;
while(i != 0 && twice<2) {
if(i%2 == 0) {
// 当前有⼀位0
twice++;
}
sum++;
// ⽆符号右移⼀位
i >>>= 1;
}
while(twice != 2) {
sum++;
twice++;
}
sum--;
return num | 1<<sum;
}
美团:后端开发
判断数字能否重排列
题⽬:⼩美给⼩团⼀个n个数字构成的数字序列,问⼩团能不能经过重新排列后形成1到n的排列。
举例:
⼩美给⼩团[2, 1, 3],则可以经过重新排列后构成[1, 2, 3],这是可⾏的。
⼩美给⼩团[4, 4, 1, 3],则⽆法经过重新排列后构成[1, 2, 3, 4],这是不可⾏的。
为了防⽌⼩团靠运⽓碰对答案,⼩美会进⾏多组询问。
短视频特效制作口碑好输⼊:
2
3
2 1 3
4
4 4 1 3
输出:
Yes
No
代码:
/**
* 第⼀⾏是⼀个数T,表⽰有T组数据。
* 对于每组数据:
* 第⼀⾏⼀个数字n表⽰⼩美给出的序列由n个数字构成。
* 接下来⼀⾏n个空格隔开的正整数。
*/
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
// 总共有sum组数据
int Int();
while(sum-- > 0) {
// 当前组的数组长度为length
int Int();
int[] arr=new int[length];
for(int i=0;i<length;i++) {
arr[i]=sc.nextInt();
}
boolean res = isSequence(arr);
if(res) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
public static boolean isSequence(int[] arr) {
Arrays.sort(arr);
if(arr[0] != 1 || arr[arr.length-1] != arr.length) {
return false;
}
for(int i=1;i<arr.length;i++) {
if(arr[i] != arr[i-1] + 1) {
return false;
}
}
return true;
}
⼩美的回⽂串构建
题⽬:⼩美现在有⼀个字符串,⼩美现在想知道能不能通过在字符串的尾端增加若⼲字符使得整个字符串变成⼀个回⽂串。
回⽂串的定义:若⼀个字符串,对他正序遍历和倒序遍历得到的结果是完全⼀致的,就称它是⼀个回⽂串。例如 abcba 就是⼀个回⽂串,因为⽆论正序还是倒序都是⼀样的。
对于字符串 abaaca,显然在该字符串末尾继续补上三个字符 aba 就可以构成 abaacaaba,就可以把原字符串变成回⽂串。换句话说,最少补上三个字符。
你的任务就是到使得原来的字符串变成回⽂串所需要的最少字符数量。
本题数据保证没有空串,因此不考虑空串是否为回⽂串。
保证输⼊的字符串仅包含⼩写字母。
输⼊:⼀⾏⼀个字符串,代表⼩美交给你的字符串。
输出:⼀⾏⼀个整数,表⽰将⼩美给出的字符串变成回⽂字符串所需要添补的最少字符数量。
例⼦:输⼊abaaca,返回3.
代码:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str = sc.nextLine();
int res = minReturnStr(str);
System.out.println(res);
}
public static int minReturnStr(String str) {
int length=str.length()-1;
// 头尾判断
int i=0,j=length;
int begin=i;
boolean flag=false;
while(i != j && i<length && j>0) {
if(str.charAt(i) == str.charAt(j)) {
i++;
j--;
flag=true;
python怎么读取json
} else {
// 不相等 i退回原来位置 j退回最尾
i=begin+1;
j=length;
begin=i;
flag=false;
}
}
if(flag) {
return begin;
}
return length;
}
YY:Java开发实习⽣-22届
到⽐输⼊的整数⼤的下⼀个⽔仙花数
⽔仙花数:可将整型数字每⼀位拆分开,将每⼀位求得m次⽅结果相加,等于原来的数字。例如:153=111+555+333,由当前每⼀位数的3次⽅组成;例如:9=9,由当前数的1次⽅组成。
题⽬:输⼊n,查⼤于n,且距离n最近的⼀位⽔仙花数。n是正整数且⼩于Integer.MAX_VALUE。
思路:⾸先要确定每⼀位数,可能由各个数的⼏次⽅组成。经规律可以发现,每⼀位数由⼏次⽅组成与当前数的位数有关,例如三位数153,由每⼀位数的三次⽅组成。以此规律,发现输⼊2位数的时候,寻不到⼆次⽅组成的⽔仙花数,由此得出结论:⼆位数没有⽔仙花数。因此需要查三位数的⽔仙花数,这时候就要改为三次⽅的组合,详情代码如下:
/**
* 到⽐输⼊的整数⼤的下⼀个⽔仙花数
* @param n 输⼊的整数
* @return ⽔仙花数
*/
public long nextNarcissisticNumber (int n) {
int length=new String(n+"").length();
// 对于整数位数为length的,那么n只可能由各个数的length次⽅组成的
long res=findCurrent(n,length);
java常见笔试题
while(res == -1){
// 若在当前位数查不到,可以查下⼀位。例如输⼊42,在43-99查不到⽔仙花数,则查三位数的100-999
length++;
res=findCurrent(n,length);
}
return res;
}
/**
* 查整数位数为length可能出现的⽔仙花数
* @param n
* @param length英文字母转ascii码
* @return
*/
private long findCurrent(int n,int length){
decades的意思System.out.println(length);
div去掉滚动条
// 以这个数为起点,计算下⼀个⽔仙花数
for(int i=n+1;i<Math.pow(10,length);i++){
int cur=i;
int sum=0;
while(cur != 0) {
int a=cur%10;
sum += Math.pow(a,length); // 加上当前位数的平⽅
// sum的值⼤于当前值:不可能匹配
if(sum > i) {
break;
}
cur /= 10;
}
if(sum == i) {
return i;
}
}
return -1;
}
⼀点资讯:2022-后端研发⼯程师
⽐较版本号
题⽬:输⼊⼀组如[["0.1.0", "1.0.2"], ["2.1.13", "1.20.0"], ["2.1.0", "2.1"],["1.0","1.0.1"]]形式的版本号数组,⽐较每⼀组中的版本号,若第⼀个⼤于等于第⼆个,返回1,否则返回2,上⾯的例⼦返回[2,1,1,2]。每⼀个版本号最多有四个正整数组成。
思路:以"."分割字符串转换为数组,依次⽐较。这⾥要注意相等的时候返回1,还有版本号长度可能不⼀样,若前⾯⼀致,还要注意后⾯的部分,如["1.0","1.0.1"]。代码如下:
public int[] max_version (String[][] version_list) {
int[] res=new int[version_list.length];
for(int i=0;i<res.length;i++) {
String[] a=version_list[i][0].split("\\.");
String[] b=version_list[i][1].split("\\.");
for(int j=0;j<4;j++) {
if(j == a.length && j == b.length) {
res[i]=1;
break;
}else if(j == a.length) {
// b数组还有数值
if(Integer.valueOf(b[j]) > 0) {
res[i]=2;
break;
}
}else if(j == b.length){
if(Integer.valueOf(a[j]) > 0) {
res[i]=1;
break;
}
}
if(Integer.valueOf(a[j]) > Integer.valueOf(b[j])) {
res[i]=1;
break;
}else if(Integer.valueOf(a[j]) < Integer.valueOf(b[j])) {
res[i]=2;
break;
}
}
}
return res;
}
查最⼩路径和
题⽬:输⼊⼀个矩阵,形如 [[1,3,1],[1,5,1],[4,2,1]],到从左上⾓⾛到右下⾓的最⼩路径和。
思路:先确定最后边⼀排和最下边⼀排的值,然后从倒数第⼆⾏倒数第⼆列,往前⾛,每次都选择最⼩的值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。