臨西網(wǎng)站建設(shè)google收錄提交入口
- 一、一維數(shù)組的動態(tài)和
- 二、將數(shù)字變成 0 的操作次數(shù)
- 三、最富有的客戶資產(chǎn)總量
- 四、Fizz Buzz
- 五、鏈表的中間結(jié)點
- 六、贖金信
一、一維數(shù)組的動態(tài)和
給你一個數(shù)組 nums 。數(shù)組「動態(tài)和」的計算公式為:runningSum[i] = sum(nums[0]…nums[i]) 。
請返回 nums 的動態(tài)和。
示例 1:
輸入:nums = [1,2,3,4]
輸出:[1,3,6,10]
解釋:動態(tài)和計算過程為 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:
輸入:nums = [1,1,1,1,1]
輸出:[1,2,3,4,5]
解釋:動態(tài)和計算過程為 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
我的解法:
class Solution {public int[] runningSum(int[] nums) {//計算數(shù)組長度,生成相同長度的數(shù)組int[] arr = new int[nums.length];//通過計算公式,得出新數(shù)組每個元素上的數(shù)據(jù)int i = 0;for(i = 0; i < nums.length; i++) {int j = 0;int count = 0;for(j = 0; j < i; j++) {count += nums[j];}arr[i] = nums[j] + count;}return arr;}
}
大佬解法一: 數(shù)組第一元素不變,其它累加上去。
class Solution {public int[] runningSum(int[] nums) {for(int i=1; i<nums.length; i++) {nums[i] += nums[i-1];}return nums;}
}
大佬解法二:
class Solution {public int[] runningSum(int[] nums) {for(int i=1; i<nums.length; i++) {nums[i] = nums[i-1] + nums[i];}return nums;}
}
二、將數(shù)字變成 0 的操作次數(shù)
給你一個非負整數(shù) num ,請你返回將它變成 0 所需要的步數(shù)。 如果當前數(shù)字是偶數(shù),你需要把它除以 2 ;否則,減去 1 。
示例 1:
輸入:num = 14
輸出:6
解釋:
步驟 1) 14 是偶數(shù),除以 2 得到 7 。
步驟 2) 7 是奇數(shù),減 1 得到 6 。
步驟 3) 6 是偶數(shù),除以 2 得到 3 。
步驟 4) 3 是奇數(shù),減 1 得到 2 。
步驟 5) 2 是偶數(shù),除以 2 得到 1 。
步驟 6) 1 是奇數(shù),減 1 得到 0 。
示例 2:
輸入:num = 8
輸出:4
解釋:
步驟 1) 8 是偶數(shù),除以 2 得到 4 。
步驟 2) 4 是偶數(shù),除以 2 得到 2 。
步驟 3) 2 是偶數(shù),除以 2 得到 1 。
步驟 4) 1 是奇數(shù),減 1 得到 0 。
我的解法:
class Solution {public int numberOfSteps(int num) {int count = 0;while(num != 0) {count += 1;if(num % 2 == 0) {num /= 2;} else {num -= 1;}}return count;}
}
大佬解法: 用位運算和三元運算符。
class Solution {public static int numberOfSteps(int num) { //14int ret = 0;while (num > 0) { // ret = ret + [(num > 1 ? 1 : 0) + (num & 0x01)]// ret=1,num=7; ret=3,num=3; ret=5,num=1; ret=6,num=0.ret += (num > 1 ? 1 : 0) + (num & 0x01);num >>= 1;}return ret;}
}
我的解法優(yōu)化: 吸取一絲大佬的思路
class Solution {public static int numberOfSteps(int num) { //14int ret = 0;while(num != 0) {ret++;if(num % 2 == 0) {num >>= 1;}else if (num % 2 == 1) {num -= 1;}}return ret;}
}
三、最富有的客戶資產(chǎn)總量
給你一個 m x n 的整數(shù)網(wǎng)格 accounts ,其中 accounts[i][j] 是第 i???????????? 位客戶在第 j 家銀行托管的資產(chǎn)數(shù)量。返回最富有客戶所擁有的 資產(chǎn)總量 。
客戶的 資產(chǎn)總量 就是他們在各家銀行托管的資產(chǎn)數(shù)量之和。最富有客戶就是 資產(chǎn)總量 最大的客戶。
示例 1:
輸入:accounts = [[1,2,3],[3,2,1]]
輸出:6
解釋:
第 1 位客戶的資產(chǎn)總量 = 1 + 2 + 3 = 6
第 2 位客戶的資產(chǎn)總量 = 3 + 2 + 1 = 6
兩位客戶都是最富有的,資產(chǎn)總量都是 6 ,所以返回 6 。
示例 2:
輸入:accounts = [[1,5],[7,3],[3,5]]
輸出:10
解釋:
第 1 位客戶的資產(chǎn)總量 = 6
第 2 位客戶的資產(chǎn)總量 = 10
第 3 位客戶的資產(chǎn)總量 = 8
第 2 位客戶是最富有的,資產(chǎn)總量是 10
我的解法:
class Solution {public int maximumWealth(int[][] accounts) {int max = 0;for(int i=0; i<accounts.length; i++) {int count = 0;for(int j=0; j<accounts[i].length; j++) {count += accounts[i][j];}if(max < count) {max = count;}}return max;}
}
大佬解法: 大佬總是會用上最高逼格的解法…
class Solution {public int maximumWealth(int[][] accounts) {int max = Integer.MIN_VALUE;for(int[] account : accounts) {max = Math.max(max, Arrays.stream(account).sum());}return max;}
}
四、Fizz Buzz
給你一個整數(shù) n ,找出從 1 到 n 各個整數(shù)的 Fizz Buzz 表示,并用字符串數(shù)組 answer(下標從 1 開始)返回結(jié)果,其中:
answer[i] == “FizzBuzz” 如果 i 同時是 3 和 5 的倍數(shù)。
answer[i] == “Fizz” 如果 i 是 3 的倍數(shù)。
answer[i] == “Buzz” 如果 i 是 5 的倍數(shù)。
answer[i] == i (以字符串形式)如果上述條件全不滿足。
示例 1:
輸入:n = 3
輸出:[“1”,“2”,“Fizz”]
示例 2:
輸入:n = 5
輸出:[“1”,“2”,“Fizz”,“4”,“Buzz”]
示例 3:
輸入:n = 15
輸出:[“1”,“2”,“Fizz”,“4”,“Buzz”,“Fizz”,“7”,“8”,“Fizz”,“Buzz”,“11”,“Fizz”,“13”,“14”,“FizzBuzz”]
我的解法:
class Solution {public List<String> fizzBuzz(int n) {List<String> list = new ArrayList<>();for(int i=1; i<=n; i++) {if((i%3==0) && (i%5==0)) {list.add("FizzBuzz");}else if(i%3==0) {list.add("Fizz");}else if(i%5==0) {list.add("Buzz");}else {list.add(Integer.toString(i));}}return list;}
}
想不到如此簡單的一個題目,有大佬能講出這么多道理:https://jtong.dev/2020/01/02/programmer-dojo/fizzbuzz-tdd/.
我的解法優(yōu)化: 性能上提升了一點點…
class Solution {public List<String> fizzBuzz(int n) {List<String> list = new ArrayList<>();for(int i=1; i<=n; i++) {if((i%3==0) && (i%5==0)) {list.add("FizzBuzz");continue;}else if(i%3==0) {list.add("Fizz");continue;}else if(i%5==0) {list.add("Buzz");continue;}else {list.add(Integer.toString(i));continue;}}return list;}
}
五、鏈表的中間結(jié)點
給定一個頭結(jié)點為 head 的非空單鏈表,返回鏈表的中間結(jié)點。
如果有兩個中間結(jié)點,則返回第二個中間結(jié)點。
示例 1:
輸入:[1,2,3,4,5]
輸出:此列表中的結(jié)點 3 (序列化形式:[3,4,5])
返回的結(jié)點值為 3 。 (測評系統(tǒng)對該結(jié)點序列化表述是 [3,4,5])。
注意,我們返回了一個 ListNode 類型的對象 ans,這樣:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
輸入:[1,2,3,4,5,6]
輸出:此列表中的結(jié)點 4 (序列化形式:[4,5,6])
由于該列表有兩個中間結(jié)點,值分別為 3 和 4,我們返回第二個結(jié)點。
我的解法:
class Solution {public ListNode middleNode(ListNode head) {ListNode fast = head;ListNode slow = head;while((fast.next != null) && (fast.next.next != null)) {fast = fast.next.next;slow = slow.next;}if(fast.next == null) {return slow;}return slow.next;}
}
六、贖金信
給你兩個字符串:ransomNote 和 magazine ,判斷 ransomNote 能不能由 magazine 里面的字符構(gòu)成。如果可以,返回 true ;否則返回 false 。magazine 中的每個字符只能在 ransomNote 中使用一次。
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小寫英文字母組成
示例 1:
輸入:ransomNote = “a”, magazine = “b”
輸出:false
示例 2:
輸入:ransomNote = “aa”, magazine = “ab”
輸出:false
示例 3:
輸入:ransomNote = “aa”, magazine = “aab”
輸出:true
我的解法:
class Solution {public static boolean canConstruct(String ransomNote, String magazine) {// 創(chuàng)建個新數(shù)組,有 26 個元素位置int[] arr = new int[26];// 創(chuàng)建變量 i,遍歷字符串 magazineint i = 0;for (i=0; i<magazine.length(); i++) {// 取 magazine 字符串的頭元素 tmp,減去 'a',得出該放在哪個元素位置int tmp = magazine.charAt(i) - 'a';arr[tmp] += 1;}// 創(chuàng)建變量 j,遍歷字符串 ransomNoteint j = 0;for (j=0; j<ransomNote.length(); j++) {// 取 ransomNote 字符串的頭元素 tmp,減去 'a',再減去新數(shù)組中該元素的個數(shù)。int tmp = ransomNote.charAt(j) - 'a';arr[tmp] -= 1;// 然后判斷,是否會遇到新數(shù)組中元素為 -1 的情況,遇到就是 falseif (arr[tmp] < 0) {return false;}}// 最后遍歷結(jié)束,結(jié)果為 truereturn true;}
}