1、生成格雷码
在一组数字的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(GrayCode),请编写一个函数,使用递归的方法生成N位的格雷码。给定一个整数n,请返回n位的格雷码,顺序从0开始。
importjava.util.Scanner;
publicclassMain{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
while(sc.hasNext()){
intk=sc.nextInt();
String[]gelei=studyenglish(k);
StringBuildersb=newStringBuilder();
for(inti=0;i<gelei.length;i++){
if(i==0){
sb.append("[");
}
sb.append('"');
sb.append(gelei[i]);
if(i==gelei.length-1){
sb.append('"');
sb.append("]");
}else{
sb.append('"');
sb.append(',');
}
}
System.out.println(sb.toString());
}
sc.close();
}
publicstaticString[]studyenglish(intk){
String[]strings=newString[(int)Math.pow(2,k)];
if(k==1){
strings[0]="0";
strings[1]="1";
returnstrings;
}else{
String[]result=studyenglish(k-1);
for(inti=0;i<result.length;i++){
strings[i]="0"+result[i];
strings[strings.length-1-i]="1"+result[i];
}
}
returnstrings;
}
}
2、微信红包
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半,请帮小明找到该红包金额。给定一个红包的金额数组gifts及它的大小n,请返回所有红包的金额。若没有金额超过红包总数的一半,返回0。
测试样例:[1,2,3,2,2],5 返回:2
importjava.util.*;
publicclassGift{
publicintgetValue(int[]gifts,intn){
//writecodehere
intans=gifts[0];
intcount=1;
for(inti=0;i<gifts.length;i++){
if(gifts[i]!=ans){
count--;
}else
count++;
if(count==0){
count=1;
ans=gifts[i];
}
}
count=0;
for(intg:gifts){
if(g==ans)
count++;
else
count--;
}
returncount>0?ans:0;
}
}
3、编码
假定一种编码的编码范围是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。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassMain{
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));
Stringstr;
while((str=reader.readLine())!=null){
char[]chars=str.trim().toCharArray();
inttemp=0,sum=0;
for(inti=0;i<4;i++){
temp*=25;
if(i<chars.length){
temp+=chars[i]-'a';
}
sum+=temp;
if(i<chars.length-1){
sum+=1;
}
}
System.out.println(sum);
}
}
}
4、游戏任务标记
游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。请用32个unsignedint类型来记录这1024个任务是否已经完成(初始状态都是未完成)。输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.lang.Math;
publicclassMain{
privatestaticint[]s=newint[32];
privatestaticinttestId(intset,intcheck){
//ID检查
if(set>1024||check>1024){
return-1;
}
//index为int数组的下标(0~31)bit为int变量的第几位(0~31)例如1--s[1]=2^31
intset_index=(set-1)/32;
intset_bit=set%32;
intcheck_index=(check-1)/32;
intcheck_bit=32*(check_index+1)-check;
//设置第一个ID任务完成
s[set_index]=s[set_index]|(int)Math.pow(2,set_bit);
//检查第二个任务是否完成
if((s[check_index]&(int)Math.pow(2,check_bit))!=0){
return1;
}
else{
return0;
}
}
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
String[]str=br.readLine().split("");
intset=Integer.parseInt(str[0]);
intcheck=Integer.parseInt(str[1]);
System.out.println(testId(set,check));
}
}
5、素对数
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。如输入为10,程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))。
importjava.util.*;
importjava.io.*;
publicclassMain{
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderbeader=newBufferedReader(newInputStreamReader(System.in));
inttarget=Integer.parseInt(beader.readLine());//获取到输入的数
int[]numbs=newint[target];
intcount=0;
intresult=0;
for(inti=2;i<target;i++){
intjudge=0;
for(intj=2;j<i;j++){
if(i%j==0){
judge=1;
break;
}
}
if(judge==0){
numbs[count]=i;
count++;
}
}
for(inti=0;i<count-1;i++){
for(intj=i;j<count;j++){
if((numbs[i]+numbs[j])==target){
result++;
break;
}
}
}
System.out.println(result);
}
}
6、数字转换机
小Q从牛博士那里获得了一个数字转换机,这台数字转换机必须同时输入两个正数a和b,并且这台数字转换机有一个红色的按钮和一个蓝色的按钮:
当按下了红色按钮,两个数字同时加1。
当按下了蓝色按钮,两个数字同时乘2。
小Q现在手中有四个整数a,b,A,B,他希望将输入的两个整数a和b变成A,B(a对应A,b对应B)。因为牛博士允许小Q使用数字转换机的时间有限,所以小Q希望按动按钮的次数越少越好。请你帮帮小Q吧。
输入描述:输入包括一行,一行中有四个正整数a,b,A,B,(1≤a,b,A,B≤10^9)。
输出描述:如果小Q可以完成转换,输出最少需要按动按钮的次数,否则输出-1。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassMain{
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
String[]str=br.readLine().split("");
inta=Integer.parseInt(str[0]);
intb=Integer.parseInt(str[1]);
intA=Integer.parseInt(str[2]);
intB=Integer.parseInt(str[3]);
System.out.println(solution(a,b,A,B));
}
privatestaticintsolution(inta,intb,intA,intB){
if(a==A&&b==B)
return0;
elseif(a!=A&&b==B)
return-1;
elseif(a==A&&b!=B)
return-1;
elseif(a>A||b>B)
return-1;
if((A&1)==0&&(B&1)==0){
intres=solution(a,b,A/2,B/2);
if(res==-1)
return-1;
returnres+1;
}
else{
intres=solution(a,b,A-1,B-1);
if(res==-1)
return-1;
returnres+1;
}
}
}
7、趣味题
小Q在学习许多排序算法之后灵机一动决定自己发明一种排序算法,小Q希望能将n个不同的数排序为升序。小Q发明的排序算法在每轮允许两种操作:
1、将当前序列中前n-1个数排为升序
2、将当前序列中后n-1个数排为升序
小Q可以任意次使用上述两种操作,小Q现在想考考你最少需要几次上述操作可以让序列变为升序。
publicclassMain{
publicstaticvoidmain(String[]args){
System.out.print(2);
}
}
关注我,后续内容更精彩~
转载:https://blog.csdn.net/xDroid_linzhuo/article/details/115655896