文章目錄
- 2024.5.26(5題)
- 1446.連續字符
- 題解一
- 題解二
- 2824.統計和小于目標的下標對數目
- 題解一
- 題解二
- 1768.交替合并字符串
- 題解一
- 題解二
- 題解三
- 796.旋轉字符串
- 題解一
- 題解二
- 1304.和為零的 N 個不同整數
- 題解一
- 題解二
2024.5.26(5題)
1446.連續字符
雙指針
題目鏈接
給你一個字符串 s
,字符串的**「能量」**定義為:只包含一種字符的最長非空子字符串的長度。
請你返回字符串 s
的 能量。
示例 1:
輸入:s = "leetcode"
輸出:2
解釋:子字符串 "ee" 長度為 2 ,只包含字符 'e' 。
示例 2:
輸入:s = "abbcccddddeeeeedcba"
輸出:5
解釋:子字符串 "eeeee" 長度為 5 ,只包含字符 'e' 。
提示:
1 <= s.length <= 500
s
只包含小寫英文字母。
題解一
class Solution {public int maxPower(String s) {int maxPower = 1;int currentPower = 1;for (int i = 1; i < s.length(); i++) {if (s.charAt(i) == s.charAt(i - 1)) {currentPower++;maxPower = Math.max(maxPower, currentPower);} else {currentPower = 1;}}return maxPower;}
}
- 這種方法通過一次遍歷字符串來計算最長的只包含一種字符的子字符串長度。
- 初始化
maxPower
和currentPower
為 1。 - 遍歷字符串,每次檢查當前字符和前一個字符是否相同。
- 如果相同,增加
currentPower
,并更新maxPower
。 - 如果不同,將
currentPower
重置為 1。
- 如果相同,增加
- 返回
maxPower
- 初始化
題解二
class Solution {public int maxPower(String s) {int maxPower = 1;int start = 0;for (int end = 1; end < s.length(); end++) {if (s.charAt(end) != s.charAt(start)) {start = end;}maxPower = Math.max(maxPower, end - start + 1);}return maxPower;}
}
- 這種方法使用雙指針,一個指針遍歷字符串,另一個指針記錄當前子字符串的起始位置。
- 初始化
maxPower
為 1,start
為 0。 - 遍歷字符串,用
end
指針指向當前字符。 - 如果當前字符與
start
指向的字符不同,移動start
到end
。 - 更新
maxPower
為end - start + 1
的最大值。 - 返回
maxPower
。
- 初始化
2824.統計和小于目標的下標對數目
雙指針
題目鏈接
給你一個下標從 0 開始長度為 n
的整數數組 nums
和一個整數 target
,請你返回滿足 0 <= i < j < n
且 nums[i] + nums[j] < target
的下標對 (i, j)
的數目。
示例 1:
輸入:nums = [-1,1,2,3,1], target = 2
輸出:3
解釋:總共有 3 個下標對滿足題目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = 0 < target
- (0, 2) ,0 < 2 且 nums[0] + nums[2] = 1 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = 0 < target
注意 (0, 3) 不計入答案因為 nums[0] + nums[3] 不是嚴格小于 target 。
示例 2:
輸入:nums = [-6,2,5,-2,-7,-1,3], target = -2
輸出:10
解釋:總共有 10 個下標對滿足題目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = -4 < target
- (0, 3) ,0 < 3 且 nums[0] + nums[3] = -8 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = -13 < target
- (0, 5) ,0 < 5 且 nums[0] + nums[5] = -7 < target
- (0, 6) ,0 < 6 且 nums[0] + nums[6] = -3 < target
- (1, 4) ,1 < 4 且 nums[1] + nums[4] = -5 < target
- (3, 4) ,3 < 4 且 nums[3] + nums[4] = -9 < target
- (3, 5) ,3 < 5 且 nums[3] + nums[5] = -3 < target
- (4, 5) ,4 < 5 且 nums[4] + nums[5] = -8 < target
- (4, 6) ,4 < 6 且 nums[4] + nums[6] = -4 < target
提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50
題解一
class Solution {public int countPairs(List<Integer> nums, int target) {int count = 0;int n = nums.size();for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (nums.get(i) + nums.get(j) < target) {count++;}}}return count;}
}
-
暴力雙循環
跟標準數組不一樣的操作是,這里獲取數組長度是
nums.size()
,得到下標的元素是用get(),而不是[]
題解二
class Solution {public int countPairs(List<Integer> nums, int target) {Collections.sort(nums);int count = 0;int n = nums.size();int left = 0;int right = n - 1;while (left < right) {if (nums.get(left) + nums.get(right) < target) {count += (right - left);left++;} else {right--;}}return count;}
}
- 先對數組進行排序,然后使用雙指針來找到滿足條件的下標對。
- 對數組進行排序。
- 初始化
count
為 0,left
為 0,right
為數組長度減 1。 - 使用雙指針遍歷數組。
- 如果
nums.get(left) + nums.get(right)
,則將right - left
加到count
,并移動left
指針。 - 否則,移動
right
指針。 - 返回
count
。
1768.交替合并字符串
經典題
題目鏈接
給你兩個字符串 word1
和 word2
。請你從 word1
開始,通過交替添加字母來合并字符串。如果一個字符串比另一個字符串長,就將多出來的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
輸入:word1 = "abc", word2 = "pqr"
輸出:"apbqcr"
解釋:字符串合并情況如下所示:
word1: a b c
word2: p q r
合并后: a p b q c r
示例 2:
輸入:word1 = "ab", word2 = "pqrs"
輸出:"apbqrs"
解釋:注意,word2 比 word1 長,"rs" 需要追加到合并后字符串的末尾。
word1: a b
word2: p q r s
合并后: a p b q r s
示例 3:
輸入:word1 = "abcd", word2 = "pq"
輸出:"apbqcd"
解釋:注意,word1 比 word2 長,"cd" 需要追加到合并后字符串的末尾。
word1: a b c d
word2: p q
合并后: a p b q c d
提示:
1 <= word1.length, word2.length <= 100
word1
和word2
由小寫英文字母組成
題解一
public class Solution {public String mergeAlternately(String word1, String word2) {StringBuilder merged = new StringBuilder();int i = 0, j = 0;while (i < word1.length() && j < word2.length()) {merged.append(word1.charAt(i++));merged.append(word2.charAt(j++));}while (i < word1.length()) {merged.append(word1.charAt(i++));}while (j < word2.length()) {merged.append(word2.charAt(j++));}return merged.toString();}
}
- 使用雙指針分別指向兩個字符串的當前位置,交替添加字符。
- 初始化一個
StringBuilder
來構建結果字符串。 - 使用兩個指針
i
和j
,分別指向word1
和word2
的當前位置。 - 交替添加字符,直到其中一個字符串被遍歷完。
- 添加剩余的字符(如果有)到結果字符串。
- 返回結果字符串。
- 初始化一個
題解二
class Solution {public String mergeAlternately(String word1, String word2) {StringBuilder merged = new StringBuilder();int maxLength = Math.max(word1.length(), word2.length());for (int i = 0; i < maxLength; i++) {if (i < word1.length()) {merged.append(word1.charAt(i));}if (i < word2.length()) {merged.append(word2.charAt(i));}}return merged.toString();}
}
- 這種方法通過循環遍歷兩個字符串,并使用條件判斷來決定添加哪個字符串的字符。
- 初始化一個
StringBuilder
來構建結果字符串。 - 計算兩個字符串的最大長度
maxLength
。 - 遍歷從 0 到
maxLength
,在每次迭代中根據當前索引是否小于各字符串的長度來決定添加哪個字符。 - 當 i 同時小于兩個字符串的長度時,兩個if都會執行,是交替拼接
- 返回結果字符串。
- 初始化一個
題解三
class Solution {public String mergeAlternately(String word1, String word2) {int w1 = word1.length();int w2 = word2.length();int index = 0;char[] ans = new char[w1 + w2];for (int i = 0; i < w1 || i < w2; i++) {if (i < w1) {ans[index++] = word1.charAt(i);}if (i < w2) {ans[index++] = word2.charAt(i);}}return new String(ans);}
}
- 使用字符數組來存儲結果字符,然后構造結果字符串。
- 與題解二不同的是,這里需要維護一個索引讓字符數組往后賦值
796.旋轉字符串
題目鏈接
給定兩個字符串, s
和 goal
。如果在若干次旋轉操作之后,s
能變成 goal
,那么返回 true
。
s
的 旋轉操作 就是將 s
最左邊的字符移動到最右邊。
- 例如, 若
s = 'abcde'
,在旋轉一次之后結果就是'bcdea'
。
示例 1:
輸入: s = "abcde", goal = "cdeab"
輸出: true
示例 2:
輸入: s = "abcde", goal = "abced"
輸出: false
提示:
1 <= s.length, goal.length <= 100
s
和goal
由小寫英文字母組成
題解一
class Solution {public boolean rotateString(String s, String goal) {if (s.length() != goal.length()) {return false;}String concatenated = s + s;return concatenated.contains(goal);}
}
- 這種方法通過將字符串
s
拼接兩次,然后檢查goal
是否是拼接后字符串的子串。- 檢查
s
和goal
的長度是否相等。如果不相等,直接返回false
。 - 將
s
拼接兩次得到concatenated
字符串。 - 檢查
goal
是否是concatenated
的子串。 - 返回結果。
- 檢查
題解二
class Solution {public boolean rotateString(String s, String goal) {if (s.length() != goal.length()) {return false;}int len = s.length();for (int i = 0; i < len; i++) {String rotated = s.substring(i) + s.substring(0, i);if (rotated.equals(goal)) {return true;}}return false;}
}
-
模擬每次旋轉后的字符串是否等于
goal
。-
檢查
s
和goal
的長度是否相等。如果不相等,直接返回false
。 -
遍歷
s
的每一個字符,將s
進行旋轉得到rotated
字符串。substring() 方法返回字符串的子字符串。
public String substring(int beginIndex) 或 public String substring(int beginIndex, int endIndex)
- beginIndex – 起始索引(包括), 索引從 0 開始。
- endIndex – 結束索引(不包括)。
-
如果
rotated
等于goal
,返回true
。 -
遍歷結束后,返回
false
。
-
1304.和為零的 N 個不同整數
題目鏈接
給你一個整數 n
,請你返回 任意 一個由 n
個 各不相同 的整數組成的數組,并且這 n
個數相加和為 0
。
示例 1:
輸入:n = 5
輸出:[-7,-1,1,3,4]
解釋:這些數組也是正確的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。
示例 2:
輸入:n = 3
輸出:[-1,0,1]
示例 3:
輸入:n = 1
輸出:[0]
提示:
1 <= n <= 1000
題解一
class Solution {public int[] sumZero(int n) {int[] result = new int[n];int index = 0;for (int i = 1; i <= n / 2; i++) {result[index++] = i;result[index++] = -i;}if (n % 2 != 0) {result[index] = 0;}return result;}
}
- 對于一個正整數
k
,可以將其對應的負整數-k
也加入數組中,這樣k + (-k) = 0
。如果n
是奇數,可以再加入一個 0。- 初始化一個長度為
n
的數組result
。 - 使用一個循環從 1 遍歷到
n / 2
,將正負對稱數加入數組。 - 如果
n
是奇數,最后加入一個 0。 - 返回結果數組。
- 初始化一個長度為
題解二
class Solution {public int[] sumZero(int n) {int[] result = new int[n];int sum = 0;for (int i = 0; i < n - 1; i++) {result[i] = i + 1;sum += i + 1;}result[n - 1] = -sum;return result;}
}
- 從 1 到
n-1
生成遞增的整數,再計算最后一個數使總和為 0。- 初始化一個長度為
n
的數組result
和一個sum
變量。 - 使用一個循環生成從 1 到
n-1
的整數并計算總和。 - 將最后一個元素設為負的總和。
- 返回結果數組。
- 初始化一個長度為