题目搜集于各位前辈,侵删。
第一题
二进制数字调转
题目描述:一个2^32的数字n,将其转换成二进制数,再倒转,求
倒转的二进制数对应的十进制数。
例如:
123
0000 0000 0000 0000 0000 0000 0111 1011
1101 1110 0000 0000 0000 0000 0000 0000
3724541952
举例:
输入:123
输出:3724541952
import java.util.Scanner;
//注意long、补0即可,签到题
public class s1801 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
long n = sc.nextLong();
String s1 = "";
while(n>0) {
if(n%2==0) {
s1 = "0"+s1;
}else {
s1 = "1"+s1;
}
n/=2;
}
while(s1.length()!=32) {
s1 = "0"+s1;
}
String s2 = new StringBuffer(s1).reverse().toString();
long k = 1;
long ans = 0;
for(int i =s2.length()-1;i>=0;i--) {
if(s2.charAt(i)=='1') {
ans+=k;
}
k*=2;
}
System.out.println(ans);
}
sc.close();
}
}
第二题
//莫名其妙的题,9到底带不带勾呢
import java.util.Scanner;
public class c1802 {
static String[][] num = {
{ "111",//0
"101",
"101",
"101",
"111"
},
{ "010",//1
"010",
"010",
"010",
"010"
},
{ "111",//2
"001",
"111",
"100",
"111"
},
{ "111",//3
"001",
"111",
"001",
"111"
},
{ "101",//4
"101",
"111",
"001",
"001"
},
{ "111",//5
"100",
"111",
"001",
"111"
},
{ "111",//6
"100",
"111",
"101",
"111"
},
{ "111",//7
"001",
"001",
"001",
"001"
},
{ "111",//8
"101",
"111",
"101",
"111"
},
{ "111",//9
"101",
"111",
"001",
"111"
},
};
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String s = sc.next();
for(int i = 0;i<5;i++) {
for(int j = 0;j<s.length();j++) {
char c = s.charAt(j);
System.out.print(num[c-'0'][i]);
}
System.out.println();
}
sc.close();
}
}
第三题
/*
* 先算出小于10000的所有素数,
* 然后从2开始判断,
* 判断方法就从素数集合里面挨个找,每次找出一个再从头找
*/
import java.util.ArrayList;
import java.util.Scanner;
public class c1803 {
static ArrayList<Integer> prime;
public static void main(String[] args) {
// TODO Auto-generated method stub
initPrime();//算出小于10000的素数集
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
int n = sc.nextInt();
int i = 0;
int k = 2;
while(i<n) {
if(ok(k)){
i++;
}
k++;
}
System.out.println(k-1);
}
sc.close();
}
static void initPrime() {
prime = new ArrayList<Integer>();
for(int i = 2;i<=10000;i++) {
int flag = 1;
for(int j = 2;j<i;j++) {
if(i%j==0) {
flag = 0;
break;
}
}
if(flag == 1) {
prime.add(i);
}
}
}
static boolean ok(int k) {
int count = 0;
while(true) {
int flag = 1;//用于判断是否遍历一遍
for(int i = 0;i<prime.size();i++) {
if(k%prime.get(i)==0) {
count++;
k/=prime.get(i);
flag = 0;
}
if(count == 8) {
return true;
}
}
if(flag == 1) {
return false;
}
}
}
}
第四题
import java.util.Arrays;
import java.util.Scanner;
/*
* 数量级太大
* n^2肯定是不行了
* 看得大佬的思路:
* 顺序遍历一次,看见0就减1,看见1就加1,
* 如果前n项是0,那么直接比较之
* 如果不是,那么存储,算一下前n项和相同的下标之差,比较之
*/
public class c1804 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
String s = sc.next();
int[] num = new int[100000];//num[k]存储前n项第一次为k的下标
Arrays.fill(num, -1);
int maxSub = 0;
int temp = 0;
for(int i = 0;i<s.length();i++) {
if(s.charAt(i)=='0') {
temp--;
}else {
temp++;
}
if(temp==0) {
maxSub = Math.max(maxSub, i+1);
}else {
if(num[temp] == -1) {
num[temp] = i;
}else {
maxSub = Math.max(maxSub, i-num[temp]);
}
}
}
System.out.println(maxSub);
}
sc.close();
}
}