網(wǎng)站網(wǎng)址有哪些臨沂seo整站優(yōu)化廠家
題目
給定一個非空字符串S,其被N個‘-’分隔成N+1的子串,給定正整數(shù)K,要求除第一個子串外,其余的子串每K個字符組成新的子串,并用‘-’分隔。
對于新組成的每一個子串,如果它含有的小寫字母比大寫字母多,則將這個子串的所有大寫字母轉(zhuǎn)換為小寫字母;
反之,如果它含有的大寫字母比小寫字母多,則將這個子串的所有小寫字母轉(zhuǎn)換為大寫字母;大小寫字母的數(shù)量相等時,不做轉(zhuǎn)換
輸入描述
輸入為兩行,第一行為參數(shù)K,第二行為字符串S
輸出描述
輸出轉(zhuǎn)換后的字符串
用例一:
輸入:
3
12abc-abCABc-4aB@
輸出:
12abc-abc-ABC-4aB-@
用例二:
輸入:
12
12abc-abCABc-4aB@
輸出:
12abc-abCABc4aB@
字符串分隔轉(zhuǎn)換算法詳解
核心解題思路
本題目要求我們處理一個由-
分隔的字符串,根據(jù)指定長度K重新拆分后續(xù)子串,并根據(jù)大小寫字母比例進行轉(zhuǎn)換。核心思路可分為以下幾步:
- 分割原始字符串:先用
-
將字符串拆分為多個子串 - 處理第一部分:保留第一個子串不變
- 重組后續(xù)部分:將剩余子串合并后按K長度重新分組
- 大小寫轉(zhuǎn)換:統(tǒng)計每組中大小寫字母數(shù)量,按規(guī)則轉(zhuǎn)換
- 重組結(jié)果:將處理后的組用
-
連接
關(guān)鍵點說明
- 大小寫轉(zhuǎn)換規(guī)則:
- 小寫字母多 → 全轉(zhuǎn)小寫
- 大寫字母多 → 全轉(zhuǎn)大寫
- 數(shù)量相等 → 不變
- 特殊字符處理:非字母字符(數(shù)字、符號等)保持不變
- 分組規(guī)則:除首個子串外,其余部分合并后按K長度分組,不足K的單獨成組
完整代碼實現(xiàn)
def transform_string():# 讀取輸入K = int(input().strip())S = input().strip()# 分割原始字符串parts = S.split('-')# 處理特殊情況:只有一個部分if len(parts) == 1:print(S)return# 保留第一部分result = [parts[0]]# 合并后續(xù)部分merged_str = ''.join(parts[1:])# 按K長度分組groups = []start = 0while start < len(merged_str):# 獲取當前分組group = merged_str[start:start+K]groups.append(group)start += K# 處理每個分組for group in groups:lower_count = 0upper_count = 0# 統(tǒng)計大小寫字母數(shù)量for char in group:if 'a' <= char <= 'z':lower_count += 1elif 'A' <= char <= 'Z':upper_count += 1# 根據(jù)規(guī)則轉(zhuǎn)換if lower_count > upper_count:# 全轉(zhuǎn)小寫new_group = ''.join(char.lower() if 'A' <= char <= 'Z' else char for char in group)elif upper_count > lower_count:# 全轉(zhuǎn)大寫new_group = ''.join(char.upper() if 'a' <= char <= 'z' else char for char in group)else:# 數(shù)量相等,保持不變new_group = groupresult.append(new_group)# 輸出結(jié)果print('-'.join(result))# 執(zhí)行函數(shù)
transform_string()
算法原理解析
1. 字符串分割與重組
parts = S.split('-')
merged_str = ''.join(parts[1:])
split('-')
:將原始字符串按-
拆分為列表join(parts[1:])
:合并除第一部分外的所有子串
2. 分組處理
while start < len(merged_str):group = merged_str[start:start+K]start += K
- 滑動窗口按K長度截取子串
- 自動處理尾部不足K的情況
3. 大小寫統(tǒng)計與轉(zhuǎn)換
for char in group:if 'a' <= char <= 'z': lower_count += 1elif 'A' <= char <= 'Z':upper_count += 1
- 精確統(tǒng)計大小寫字母數(shù)量
- 非字母字符不影響統(tǒng)計結(jié)果
4. 轉(zhuǎn)換規(guī)則應(yīng)用
if lower_count > upper_count:# 轉(zhuǎn)小寫
elif upper_count > lower_count:# 轉(zhuǎn)大寫
else:# 保持不變
- 僅轉(zhuǎn)換字母字符
- 非字母字符保持原樣
- 數(shù)量相等時不操作
示例解析
示例1:輸入3
和12abc-abCABc-4aB@
-
初始分割:
parts = ["12abc", "abCABc", "4aB@"]
- 第一部分保留:
"12abc"
-
合并后續(xù):
merged_str = "abCABc4aB@"
-
按K=3分組:
["abC", "ABc", "4aB", "@"]
-
分組處理:
分組 小寫字母 大寫字母 操作 結(jié)果 abC a,b(2) C(1) 轉(zhuǎn)小寫 abc ABc c(1) A,B(2) 轉(zhuǎn)大寫 ABC 4aB a(1) B(1) 不變 4aB @ 0 0 不變 @ -
最終輸出:
"12abc-abc-ABC-4aB-@"
示例2:輸入12
和12abc-abCABc-4aB@
-
初始分割:
parts = ["12abc", "abCABc", "4aB@"]
- 第一部分保留:
"12abc"
-
合并后續(xù):
merged_str = "abCABc4aB@"
(長度9)
-
按K=12分組:
["abCABc4aB@"]
(僅1組)
-
分組處理:
- 小寫字母:a,b,c,a(4個)
- 大寫字母:C,A,B,B(4個)
- 數(shù)量相等 → 不變
-
最終輸出:
"12abc-abCABc4aB@"
總結(jié)與拓展
關(guān)鍵知識點
- 字符串處理:split/join操作
- 滑動窗口:按固定長度分組
- 字符統(tǒng)計:大小寫字母識別
- 條件轉(zhuǎn)換:基于統(tǒng)計結(jié)果的字符串轉(zhuǎn)換
拓展思考
- 多分隔符處理:如何支持多個不同分隔符
- 動態(tài)K值:K值根據(jù)內(nèi)容動態(tài)調(diào)整
- 并行處理:大數(shù)據(jù)量時分組并行計算
- 國際化支持:處理非英文字符(如中文、阿拉伯文)
本解法通過清晰的分步處理,完美實現(xiàn)了題目要求的轉(zhuǎn)換功能。初學者可從中學習:
- 字符串拆分與重組技巧
- 分組統(tǒng)計的實現(xiàn)方法
- 條件轉(zhuǎn)換的邏輯設(shè)計
- 邊界情況的處理策略
核心啟示:字符串處理的關(guān)鍵在于分解問題,將復(fù)雜需求拆分為獨立的處理步驟,再組合解決。