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://www.uj5u.com/qita/275876.html
標籤:其他
上一篇:演算法-連勝概率問題-如何上王者
下一篇:Linux--信號
