1768. 交替合并字串
題目鏈接
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 <= 100word1和word2由小寫英文字母組成
解題思路一【Java語言】
時間6 ms 擊敗 12.69%
記憶體40.6 MB 擊敗 10.66%
在這個程式中,我們需要將兩個字串按照交替的順序合并起來,我們首先找到兩個字串的最小長度和最大長度,然后,我們用一個回圈將兩個字串的字符按照交替的順序逐個取出來,并將它們相加到一個新的字串中,如果有一個字串的長度較短,那么我們需要將較長的字串中剩余的字符都添加到結果字串的末尾,最后,我們回傳合并后的字串作為結果,
這個程式涉及到以下幾個知識點:
- 字串長度和字符訪問:通過呼叫字串的length()方法可以獲取字串的長度,通過呼叫charAt()方法可以訪問字串中的指定位置的字符,
- 回圈:使用for回圈來對兩個字串的字符進行遍歷操作,
- 字串拼接:使用+運算子可以將兩個字串拼接成一個新的字串,
- 字串截取:使用substring()方法可以從一個字串中截取指定位置的子字串,
- 數學函式:使用Math.min()和Math.max()函式可以分別找到兩個數字中的最小值和最大值,
- 字串的基本操作:對字串進行長度比較和截取字符,
class Solution {
public String mergeAlternately(String word1, String word2) {
int finalMinLength=Math.min(word1.length(), word2.length());
int finalMaxLength=Math.max(word1.length(), word2.length());
String result="";
int i=0;
for(i=0;i<finalMinLength;i++){
result+=(word1.substring(i,i+1)+word2.substring(i,i+1));
}
if(finalMinLength==finalMaxLength){
return result;
}else if(finalMinLength==word1.length()){
result+=word2.substring(i);
}else{
result+=word1.substring(i);
}
return result;
}
}
389. 找不同
題目鏈接
389. 找不同
題目描述
給定兩個字串 s 和 t ,它們只包含小寫字母,
字串 t 由字串 s 隨機重排,然后在隨機位置添加一個字母,
請找出在 t 中被添加的字母,
示例 1:
輸入:s = "abcd", t = "abcde"
輸出:"e"
解釋:'e' 是那個被添加的字母,
示例 2:
輸入:s = "", t = "y"
輸出:"y"
提示:
0 <= s.length <= 1000t.length == s.length + 1s和t只包含小寫字母
- 位運算
- 哈希表
- 字串
- 排序
解題思路一【Java語言】
時間1 ms 擊敗 98.85%
記憶體40 MB 擊敗 25.59%當我們把兩個相同的數進行異或運算時,結果為 0,所以如果字串 t 是由字串 s 隨機重排并在隨機位置添加一個字母得到的,那么 t 中的所有字符都可以與 s 中的相應字符進行異或運算,最后得到的結果就是添加的字母,
具體步驟如下:
- 定義一個變數 result,并初始化為 0,
- 遍歷字串 s 的每個字符,對每個字符執行異或運算,
- 遍歷字串 t 的每個字符,對每個字符執行異或運算,
- 異或運算會將兩個二進制位不同的位置設為 1,相同的位置設為 0,因此,最后運算的結果就是添加的字母,
假設有以下輸入:
s = "hello" t = "lohlel"
我們可以按照以下步驟來解釋演算法的運行:
首先,對字串 s 進行遍歷,依次進行異或運算:
- 遍歷到 'h',結果 result = 'h' ^ 0 = 'h'
- 遍歷到 'e',結果 result = 'h' ^ 'e' = 'h' ^ 'e'
- 遍歷到 'l',結果 result = 'h' ^ 'e' ^ 'l' = 'h' ^ 'e' ^ 'l'
- 遍歷到 'l',結果 result = 'h' ^ 'e' ^ 'l' ^ 'l' = 'h' ^ 'e' ^ 'l' ^ 'l'
- 遍歷到 'o',結果 result = 'h' ^ 'e' ^ 'l' ^ 'l' ^ 'o' = 'h' ^ 'e' ^ 'l' ^ 'l' ^ 'o'
然后,對字串 t 進行遍歷,同樣進行異或運算:
- 遍歷到 'l',結果 result = 'h' ^ 'e' ^ 'l' ^ 'l' ^ 'o' ^ 'l' = 'h' ^ 'e' ^ 'o' ^ 'l'
- 遍歷到 'o',結果 result = 'h' ^ 'e' ^ 'o' ^ 'l' ^ 'o' = 'h' ^ 'e' ^ 'l'
- 遍歷到 'h',結果 result = 'h' ^ 'e' ^ 'l' ^ 'h' = 'e' ^ 'l'
- 遍歷到 'l',結果 result = 'e' ^ 'l' ^ 'l' = 'e'
- 遍歷到 'e',結果 result = 'e' ^ 'e' = 0
最后的結果為 0,表示在 t 中被添加的字母是 'e',
通過對 s 和 t 進行異或運算,最后運算的結果就是被添加的字母,
程式用到的知識點包括:
- 異或運算
class Solution {
public char findTheDifference(String s, String t) {
char result = 0;
for (char c : s.toCharArray()) {
result ^= c;
}
for (char c : t.toCharArray()) {
result ^= c;
}
return result;
}
}
28. 找出字串中第一個匹配項的下標
題目鏈接
28. 找出字串中第一個匹配項的下標
題目描述
給你兩個字串 haystack 和 needle ,請你在 haystack 字串中找出 needle 字串的第一個匹配項的下標(下標從 0 開始),如果 needle 不是 haystack 的一部分,則回傳 -1 ,
示例 1:
輸入:haystack = "sadbutsad", needle = "sad"
輸出:0
解釋:"sad" 在下標 0 和 6 處匹配,
第一個匹配項的下標是 0 ,所以回傳 0 ,
示例 2:
輸入:haystack = "leetcode", needle = "leeto"
輸出:-1
解釋:"leeto" 沒有在 "leetcode" 中出現,所以回傳 -1 ,
提示:
1 <= haystack.length, needle.length <= 104haystack和needle僅由小寫英文字符組成
解題思路一【Java語言】
時間0 ms 擊敗 100%
記憶體39.4 MB 擊敗 64.64%
這道題劃歸為中等難度著實有些無語了
class Solution {
public int strStr(String haystack, String needle) {
return haystack.indexOf(needle);
}
}
242. 有效的字母異位詞
題目鏈接
242. 有效的字母異位詞
題目描述
給定兩個字串 s 和 t ,撰寫一個函式來判斷 t 是否是 s 的字母異位詞,
注意:若 s 和 t 中每個字符出現的次數都相同,則稱 s 和 t 互為字母異位詞,
示例 1:
輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:
輸入: s = "rat", t = "car"
輸出: false
提示:
1 <= s.length, t.length <= 5 * 104s和t僅包含小寫字母
進階: 如果輸入字串包含 unicode 字符怎么辦?你能否調整你的解法來應對這種情況?
Related Topics- 哈希表
- 字串
- 排序
解題思路一【Java語言】
時間340 ms 擊敗 5.49%
記憶體44.2 MB 擊敗 5.4%解題思路如下:
- 創建兩個字符陣列a1和a2,分別存盤字串s和t的字符,
- 使用Arrays類的sort方法對a1和a2進行排序,使得兩個陣列中的字符按照字典序排序,
- 創建兩個空字串resultA和resultB,分別用于存盤排序后的a1和a2,
- 遍歷a1和a2,將每個字符依次追加到resultA和resultB,
- 最后,判斷resultA和resultB是否相等,如果相等,則s和t是字母異位詞,回傳true;否則,回傳false,
class Solution {
public boolean isAnagram(String s, String t) {
char [] a1=s.toCharArray();
char [] a2=t.toCharArray();
Arrays.sort(a1);
Arrays.sort(a2);
String resultA="";
String resultB="";
for (char c : a1) {
resultA+= c;
}
for (char c : a2) {
resultB+= c;
}
return resultA.equals(resultB);
}
}
程式用到的知識點包括:
- 字串轉字符陣列:使用toCharArray方法,
- 字符陣列排序:使用Arrays類的sort方法,
- 字串拼接:通過回圈遍歷字符陣列,將每個字符依次追加到字串中,
- 字串比較:使用equals方法判斷兩個字串是否相等,
459. 重復的子字串
題目鏈接
459. 重復的子字串
題目描述
給定一個非空的字串 s ,檢查是否可以通過由它的一個子串重復多次構成,
示例 1:
輸入: s = "abab"
輸出: true
解釋: 可由子串 "ab" 重復兩次構成,
示例 2:
輸入: s = "aba"
輸出: false
示例 3:
輸入: s = "abcabcabcabc"
輸出: true
解釋: 可由子串 "abc" 重復四次構成, (或子串 "abcabc" 重復兩次構成,)
提示:
1 <= s.length <= 104s由小寫英文字母組成
解題思路一【Java語言】
時間83 ms 擊敗 23.96%
記憶體42.8 MB 擊敗 43.30%
- s+s
- 破壞到第一個s的前半部分,破壞掉第二個s的后半部分
- 如果是一個子串重復多次構成,則第一個s的后半部分和第二個s的前半部分一定可以拼湊成一個s
- 如果不是,肯定拼湊不出來
- 即s+s,掐頭去尾找自己
class Solution {
public boolean repeatedSubstringPattern(String s) {
String str = s+s;
str = str.substring(1,str.length() - 1);
return str.contains(s);
}
}
283. 移動零
題目鏈接
283.移動零
題目描述
給定一個陣列 nums,撰寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序,
請注意 ,必須在不復制陣列的情況下原地對陣列進行操作,
示例 1:
輸入: nums = [0,1,0,3,12] 輸出: [1,3,12,0,0]
示例 2:
輸入: nums = [0] 輸出: [0]
提示:
1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1
解題思路一【Java語言】
時間1 ms 擊敗 100%
記憶體44.3 MB 擊敗 5.12%可以使用雙指標的方法,一個指標用于遍歷陣列,另一個指標指向下一個非零元素應該插入的位置,
具體步驟如下:
-
初始化兩個指標,i指向當前遍歷的元素,j指向下一個非零元素應該插入的位置,
-
遍歷陣列,如果當前元素為0,則繼續遍歷下一個元素;如果當前元素不為0,則將當前元素復制到j指向的位置,并將i和j都加1,
-
遍歷完陣列后,將j之后的所有元素都置為0,以保證陣列長度不變,
class Solution {
public void moveZeroes(int[] nums) {
int i = 0, j = 0;
for (; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j] = nums[i];
j++;
}
}
while (j < nums.length) {
nums[j] = 0;
j++;
}
}
}
程式涉及到以下的一些知識點:
-
陣列操作:對陣列進行遍歷、修改陣列元素的值等等,
-
雙指標:使用兩個指標來進行陣列操作,一個指向當前遍歷的元素,另一個指向下一個非零元素應該插入的位置,
-
條件判斷:在遍歷陣列的程序中,通過條件判斷來判斷當前元素是否為0,
-
陣列長度:使用陣列長度來確定遍歷的范圍和陣列的結束位置,
66. 加一
題目鏈接
66.加一
題目描述
給定一個由 整數 組成的 非空 陣列所表示的非負整數,在該數的基礎上加一,
最高位數字存放在陣列的首位, 陣列中每個元素只存盤單個數字,
你可以假設除了整數 0 之外,這個整數不會以零開頭,
示例 1:
輸入:digits = [1,2,3]
輸出:[1,2,4]
解釋:輸入陣串列示數字 123,
示例 2:
輸入:digits = [4,3,2,1]
輸出:[4,3,2,2]
解釋:輸入陣串列示數字 4321,
示例 3:
輸入:digits = [0]
輸出:[1]
提示:
1 <= digits.length <= 1000 <= digits[i] <= 9
解題思路一【Java語言】
時間11 ms 擊敗 0.89%
記憶體40.7 MB 擊敗 5.18%
具體步驟如下:
- 將整數陣列中的每個元素轉換為字串,并拼接起來得到一個表示整數的字串,
- 使用BigInteger類將字串表示的整數轉換為BigInteger物件,
- 使用BigInteger的add方法將該物件加一,
- 將加一后的BigInteger物件轉換為字串,并將字串轉換為字符陣列,
- 遍歷字符陣列,將每個字符轉換為對應的數字,存入一個新的整數陣列,
- 回傳新的整數陣列,
import java.math.BigInteger;
class Solution {
public int[] plusOne(int[] digits) {
int length=digits.length;
String sum="";
for(int i=0;i<length;i++){
sum=sum+digits[i];
}
BigInteger number=new BigInteger(sum);
number=number.add(BigInteger.ONE);
char[] charArray = number.toString().toCharArray();
int[] intArray = new int[charArray.length];
for(int i = 0; i < charArray.length; i++) {
intArray[i] = Character.getNumericValue(charArray[i]);
}
return intArray;
}
}
這個程式用到了以下知識點:
- 陣列:使用int[] digits表示整數陣列,
- 字串操作:使用String類將整數陣列元素轉換為字串,并通過字串拼接進行數字的拼接,
- 大整數操作:使用BigInteger類進行大整數的運算,
- 字串-字符轉換:使用String類的toCharArray方法將字串轉換為字符陣列,
- 字符-數字轉換:使用Character類的getNumericValue方法將字符轉換為對應的數字,
工程日志
2023-07-02
- LeetCode有些題目的標簽確實是不盡合理,459. 重復的子字串雖然是簡單但是確實是花了很多時間想,但是像28. 找出字串中第一個匹配項的下標就一句代碼就絕了
- 有些題目如果十幾二十分鐘腦中空白那基本是想不到解決方法了,直接看題解,這是經驗不夠的問題,一道題想很久才做出來也沒意義,因為競賽和面試不會給這么多時間
- 有的時候不要被題目本身的介紹所局限,有的時候需要跳出題目誤導的思維,找另一條路解開是更合適的方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556503.html
標籤:其他
上一篇:MBR初認識
下一篇:返回列表
