2026-05-08:反轉字符串前綴。用go語言,給定字符串 s 和整數 k,把 s 的開頭 k 個字符順序完全倒過來(其余字符保持原樣),輸出新的字符串。
1 <= s.length <= 100。
s 僅由小寫英文字母組成。
1 <= k <= s.length。
輸入: s = "abcd", k = 2。
輸出: "bacd"。
解釋:
前 k = 2 個字符 "ab" 反轉為 "ba"。最終得到的結果字符串為 "bacd"。
題目來自力扣3794。
執行過程詳細描述 步驟1:接收輸入參數
程序接收到兩個關鍵輸入:
? 待處理的原始字符串:
abcd(由4個小寫英文字母組成)? 需要反轉的前綴長度:
2(表示只反轉字符串最開頭的2個字符)
Go語言中的字符串是不可變類型,無法直接修改字符順序,因此需要將字符串轉換為字節切片:
? 原始字符串
abcd轉換后得到字節切片:['a', 'b', 'c', 'd']? 轉換的目的:只有字節切片支持直接交換元素位置,才能實現字符反轉
1. 計算字節切片的總長度:長度為4
2. 校驗輸入的k值:題目規定
1<=k<=字符串長度,這里k=2小于4,無需調整3. 確定反轉區間:需要反轉索引0到索引1的字符(前k個字符,索引從0開始計數,結束位置為k-1)
使用左指針和右指針相向移動,交換指針指向的字符,直到兩指針相遇:
1. 初始化指針:左指針
l指向起始位置0(字符a),右指針r指向結束位置1(字符b)2. 第一次交換:交換
l=0和r=1的字符,字節切片變為['b', 'a', 'c', 'd']3. 指針移動:左指針
l加1變為1,右指針r減1變為04. 終止判斷:此時
l >= r,反轉操作結束,無需繼續交換
反轉完成后,索引2、3位置的字符c、d全程沒有被修改,保持原始順序不變。
最終的字節切片為:['b', 'a', 'c', 'd']
步驟6:字節切片轉換回字符串
將處理完成的字節切片重新轉換為Go語言字符串格式,得到最終結果:bacd
步驟7:輸出結果
程序將最終的字符串bacd打印輸出,完成整個處理流程。
時間復雜度與額外空間復雜度分析 1. 時間復雜度
時間復雜度為O(k)(k是需要反轉的前綴長度):
? 核心操作是雙指針交換字符,只需要遍歷前k個字符,交換次數為
k/2次;? 剩余的字符無需任何操作,整體執行次數和k成正比,與字符串總長度n無關。
? 簡化表示:也可寫為O(n)(n為字符串總長度),因為k≤n,是等價的復雜度量級。
額外空間復雜度為O(n)(n為字符串總長度):
? 程序額外創建了一個和原字符串長度相同的字節切片,用于存儲和修改字符;
? 除了這個字節切片外,只使用了常數個指針變量(l、r、n等),沒有占用其他額外空間;
? 額外空間大小與輸入字符串的長度成正比。
1. 執行核心:轉字節切片→雙指針反轉前k個字符→轉回字符串,剩余字符保持不變;
2. 時間復雜度:O(k)(最優情況,僅遍歷需要反轉的部分);
3. 額外空間復雜度:O(n)(因字符串不可變,必須開辟新切片存儲)。
package main
import (
"fmt"
)
func reversePrefix(s string, k int)string {
// 將字符串轉換為字節切片以便交換
bytes := []byte(s)
n := len(bytes)
// 確保 k 不超過字符串長度
if k > n {
k = n
}
// 反轉從 0 到 k-1 的字符
for l, r := 0, k-1; l < r; l, r = l+1, r-1 {
bytes[l], bytes[r] = bytes[r], bytes[l]
}
returnstring(bytes)
}func main() {
s := "abcd"
k := 2
result := reversePrefix(s, k)
fmt.Println(result)
}
Python完整代碼如下:
# -*-coding:utf-8-*-
def reversePrefix(s: str, k: int) -> str:
# 將字符串轉換為列表以便交換
chars = list(s)
n = len(chars)
# 確保 k 不超過字符串長度
if k > n:
k = n
# 反轉從 0 到 k-1 的字符
left, right = 0, k - 1
while left < right:
chars[left], chars[right] = chars[right], chars[left]
left += 1
right -= 1
return''.join(chars)if __name__ == "__main__":
s = "abcd"
k = 2
result = reversePrefix(s, k)
print(result)
C++完整代碼如下:
using namespace std;
string reversePrefix(string s, int k) {
// 確保 k 不超過字符串長度
int n = s.length();
if (k > n) {
k = n;
}
// 反轉從 0 到 k-1 的字符
for (int l = 0, r = k - 1; l < r; l++, r--) {
swap(s[l], s[r]);
}
return s;
}int main() {
string s = "abcd";
int k = 2;
string result = reversePrefix(s, k);
cout << result << endl;
return0;
}
我們相信人工智能為普通人提供了一種“增強工具”,并致力于分享全方位的AI知識。在這里,您可以找到最新的AI科普文章、工具評測、提升效率的秘籍以及行業洞察。 歡迎關注“福大大架構師每日一題”,發消息可獲得面試資料,讓AI助力您的未來發展。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.