文章目录
科大讯飞: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 sum=sc.nextInt();
while(sum-- > 0) {
// 当前组的数组长度为length
int length=sc.nextInt();
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,就可以把原字符串变成回