算法每日学打卡:java语言基础题目打卡(01-10)
文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。
“算法每日學”計劃01打卡:
問題描述
對于長度為5位的一個01串,每一位都可能是0或1,一共有32種可能。它們的前幾個是:
00000
00001
00010
00011
00100
請按從小到大的順序輸出這32種01串。
輸入格式
本試題沒有輸入。
輸出格式
輸出32行,按從小到大的順序每行一個長度為5的01串。
樣例輸出
00000
00001
00010
00011
<以下部分省略>
解題思路與實現
如果有小伙伴很少接觸到這種題目的話,可能會覺得有點陌生,不知道從何下手,可能一開始我們能想到“最笨”的方法,但是也覺得挺有“娛樂性”的方法。
System.out.println("00000") .......... System.out.println("11111")這種方式是不是也能夠得到最后的結果,沒錯,當然沒問題,但是,我們在思考的時候可以一步一步來,嘗試多種方法,找到最優解。
這種方法看來不太好,一是不夠靈活,二是敲代碼很累,所以,改進一下。
這種方式是不是能夠更加靈活的解決這個問題,這個解決的方式就是我們常說的“暴力破解”,全部用for循環來遍歷所有的情況,如果找到符合的情況就輸出,但是我們會發現,這個算法的時間復雜度是:O(n^5),這個方法比前一種方法更好了,但是還不是最好的答案。
public static void main(String[] args) {for (int i = 0; i < 32; i++) {String result = Integer.toBinaryString(i);int num = result.length();for (int j = 0; j < 5 - num; j++) {result = "0" + result;}System.out.println(result);}}再來看看這種方法,這種方法的思路:通過jdk的方法Integer.toBinaryString()獲取到每個數字的二進制,因為要求輸出的是形如“11111”的五位數字,所以,我們還需要根據得到的二進制的數字的長度,在這個字符串的前面加上5 - num個“0”,比如,得到的二進制是1(長度為1),所以在1的前面要加上5-(num=1)等于4個0。
是不是特別的簡潔,而且這種方法的效率應該也是不錯的:O(n),因為這個是jdk提供的方法,在底層是用位移的方法來實現的(注:我們不推薦用jdk的方法來解決,我們盡量用自己思考的方法來解決,就算這個方法“笨”,但是也是自己思考了)。
當然,如果我們換個角度,也可以的到另一種解法。
public static void main(String args[]){ for(int i=0;i<32;i++){ String str = Integer.toBinaryString(i); switch (str.length()) { case 1: str = "0000"+str; break; case 2: str = "000"+str;break;case 3:str = "00"+str;break;case 4:str = "0"+str;break;}System.out.println(str);}} }這種解法只是用switch-case的方式來解決而已,思路和上面一樣。
“算法每日學”計劃02打卡:
問題描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進制數的0至15。十六進制的計數方法是滿16進1,所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
給出一個非負整數,將它表示成十六進制的形式。
輸入格式
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
輸出這個整數的16進制表示
樣例輸入
30
樣例輸出
1E
上面是api,下面看看其他:
這道題本身是沒什么難度的,只要用遞歸處理,當輸入的數字大于等于16時,則遞歸處理該數整除16的值,然后再輸出最后一位即可。
但是,我在做的時候,一開始沒有考慮到整除16后的值大于9的情況和整除16的次數大于9的情況,結,如下圖
以后要注意考慮全方面和一定要注意數據范圍!
import java.util.Scanner; public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int a=sc.nextInt();int[] b=new int[8]; //數組b的元素個數由a決定,由于a<=2^32,即a<=16^8char[] s={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};if(a>=0&&a<16){for(int i=0;i<16;i++){int m=a%16;if(m==i)System.out.println(s[i]);}}else{int i=0;while(a!=0){b[i]=a%16;a=a/16;i++;}for(int j=i-1;j>=0;j--){if(b[j]==10)System.out.print("A");else if(b[j]==11)System.out.print("B");else if(b[j]==12)System.out.print("C");else if(b[j]==13)System.out.print("D");else if(b[j]==14)System.out.print("E");else if(b[j]==15)System.out.print("F");elseSystem.out.print(b[j]);}}} }“算法每日學”計劃03打卡:
問題描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。
輸入格式
每個測試案例包括2行:
第一行輸入一個整數n(1<=n<=100000),表示數組中元素的個數。
第二行輸入n個整數,表示數組中的每個元素,這n個整數的范圍是[1,1000000000]。
輸出格式
對應每個測試案例,輸出出現的次數超過數組長度的一半的數,如果沒有輸出-1。
樣例輸入
9
1 2 3 2 2 2 5 4 2
9
1 1 1 2 2 2 3 3 3
樣例輸出
2
-1
“算法每日學”計劃04打卡:
問題描述
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
輸入
輸入可能包含多個測試樣例,對于每個測試案例,
輸入的第一行為兩個整數m和n(1<=m,n<=1000):代表將要輸入的矩陣的行數和列數。
輸入的第二行包括一個整數t(1<=t<=1000000):代表要查找的數字。
接下來的m行,每行有n個數,代表題目所給出的m行n列的矩陣(矩陣如題目描述所示,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
輸出
對應每個測試案例,
輸出”Yes”代表在二維數組中找到了數字t。
輸出”No”代表在二維數組中沒有找到數字t。
樣例輸入
3 3
5
1 2 3
4 5 6
7 8 9
3 3
1
2 3 4
5 6 7
8 9 10
樣例輸出
YES
NO
“算法每日學”計劃05打卡:
問題描述
理論知識學習,算法基礎,理解時間復雜度,理解空間復雜度。
輸入
無
輸出
無
查看相關資料
"算法每日學計劃"06打卡:
問題描述
給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行為一個整數n。
第二行包含n個整數,為待排序的數,每個整數的絕對值小于10000。
輸出格式
輸出一行,按從小到大的順序輸出排序后的數列。
樣例輸入
5
8 3 6 4 9
樣例輸出
3 4 6 8 9
注:題目簡單,解法不少于10種,踴躍發言。
查看相關排序算法,公眾號將逐步更新排序算法。
“算法每日學計劃”07打卡:
問題描述
求出區間[a,b]中所有整數的質因數分解。
輸入格式
輸入兩個整數a,b。
輸出格式
每行輸出一個數的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是從小到大的)(具體可看樣例)
樣例輸入
3 10
樣例輸出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先篩出所有素數,然后再分解。
數據規模和約定
2<=a<=b<=10000
“算法每日學計劃”08打卡:
問題描述
給定兩個僅由大寫字母或小寫字母組成的字符串(長度介于1到10之間),它們之間的關
系是以下4中情況之一:
1:兩個字符串長度不等。比如 Beijing 和 Hebei
2:兩個字符串不僅長度相等,而且相應位置上的字符完全一致(區分大小寫),比如
Beijing 和 Beijing
3:兩個字符串長度相等,相應位置上的字符僅在不區分大小寫的前提下才能達到完
全一致(也就是說,它并不滿足情況2)。比如 beijing 和 BEIjing
4:兩個字符串長度相等,但是即使是不區分大小寫也不能使這兩個字符串一致。比
如 Beijing 和 Nanjing
編程判斷輸入的兩個字符串之間的關系屬于這四類中的哪一類,給出所屬的類的編號
。
輸入格式
包括兩行,每行都是一個字符串
輸出格式
僅有一個數字,表明這兩個字符串的關系編號
樣例輸入
BEIjing
beiJing
樣例輸出
3
注意:簡單題目
“算法每日學計劃”09打卡:
問題描述
給定一個N階矩陣A,輸出A的M次冪(M是非負整數)
例如:
A =
1 2
3 4
A的2次冪
7 10
15 22
輸入格式
第一行是一個正整數N、M(1<=N<=30, 0<=M<=5),表示矩陣A的階數和要求的冪數
接下來N行,每行N個絕對值不超過10的非負整數,描述矩陣A的值
輸出格式
輸出共N行,每行N個整數,表示A的M次冪所對應的矩陣。相鄰的數之間用一個空格
隔開
樣例輸入
2 2
1 2
3 4
樣例輸出
7 10
15 22
“算法每日學計劃”10打卡:
問題描述
亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯在每層都停。實習生小飛常常會被每層都停的電梯弄得很不耐煩,于是他提出了這樣一個辦法:
由于樓層并不算太高,那么在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達某層后,電梯停下來,所有乘客再從這里爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少。
問題分析
該問題本質上是一個優化問題。
首先為這個問題找到一個合適的抽象模型。
有兩個因素會影響結果:乘客的數目和乘客的目的樓層。
**思路:**假設電梯現在停在第i層,i層以下的人有N1個,i層有N2個,i層以上的人有N3個,當前需要走的樓梯數為Y。當電梯再往上走一層時,i層及i層以下的人一共需要多走N1+N2步,而i層以上的人則一共少走了N3步,所以當N1+N2時,電梯應該繼續往上走。
Java代碼:
public class Main {public static int stopLift(int[] to) {if (to.length < 2) {return -1;}int n1 = 0, n2 = to[1], n3= 0, y = 0;// 計算一層及以上的人數for (int i = 1; i < to.length; i++) {n3 += to[i];y += (i - 1) * to[i];}for(int i = 1; i < to.length; i++) {n2 = to[i];n1 += to[i - 1];n3 = n3 - n2;if (n1 + n2 >= n3) {return i;}}return -1;}public static void main(String[] args) {int[] to = {0, 1, 2 ,3 ,5 ,6, 7};System.out.format("電梯應該停在第%d層。", stopLift(to));} }總結
以上是生活随笔為你收集整理的算法每日学打卡:java语言基础题目打卡(01-10)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “面试不败计划”:集合、日期、异常、序列
- 下一篇: java实现支付宝支付完整过程(沙箱测试