網(wǎng)站域名在哪買近一周的新聞大事熱點(diǎn)
【華為OD-E卷-尋找關(guān)鍵鑰匙 100分(python、java、c++、js、c)】
題目
小強(qiáng)正在參加《密室逃生》游戲,當(dāng)前關(guān)卡要求找到符合給定 密碼K(升序的不重復(fù)小寫字母組成) 的箱子,并給出箱子編號(hào),箱子編號(hào)為 1~N 。
每個(gè)箱子中都有一個(gè) 字符串s ,字符串由大寫字母、小寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)、空格組成,需要在這些字符串中找到所有的字母,忽略大小寫后排列出對(duì)應(yīng)的密碼串,并返回匹配密碼的箱子序號(hào)。
提示:滿足條件的箱子不超過1個(gè)。
輸入描述
- 第一行為 key 的字符串,
第二行為箱子 boxes,為數(shù)組樣式,以空格分隔
箱子 N 數(shù)量滿足 1 ≤ N ≤ 10000, s 長(zhǎng)度滿足 0 ≤ s.length ≤ 50, 密碼為僅包含小寫字母的升序字符串,且不存在重復(fù)字母, 密碼 K 長(zhǎng)度1 ≤ K.length ≤ 26
輸出描述
- 返回對(duì)應(yīng)箱子編號(hào)
如不存在符合要求的密碼箱,則返回 -1。
備注
- 箱子中字符拼出的字符串與密碼的匹配忽略大小寫,且要求與密碼完全匹配,如密碼abc匹配aBc,但是密碼abc不匹配abcd
用例
用例一:
輸入:
abc
s,sdf134 A2c4b
輸出:
2
用例二:
輸入:
abc
s,sdf134 A2c4bd 523[]
輸出:
1
python解法
- 解題思路:
- 這段代碼的目標(biāo)是從一組字符串(boxes)中找到第一個(gè)可以和輸入的 key 匹配的箱子(匹配條件是兩個(gè)字符串的字符可以完全重排成彼此,忽略大小寫和非字母字符)。匹配時(shí)返回箱子的索引(從 1 開始),如果找不到匹配則返回 -1。
具體匹配條件:
對(duì) key 按字母排序。
對(duì)每個(gè)箱子,過濾出其中的字母字符,轉(zhuǎn)換為小寫后排序。
比較 key 的排序結(jié)果和當(dāng)前箱子過濾后排序的結(jié)果是否相同
# 讀取輸入 key 和 boxes 列表
key = input() # 匹配的關(guān)鍵字符串
boxes = input().split() # 多個(gè)箱子名稱,以空格分隔def find_box_index(key, boxes):key_sorted = sorted(key) # 對(duì) key 字符串排序,作為匹配基準(zhǔn)for i, box in enumerate(boxes): # 遍歷所有箱子# 過濾箱子中的字母字符,并轉(zhuǎn)換為小寫filtered_chars = [c.lower() for c in box if c.isalpha()]# 檢查過濾后的字符排序是否與 key 的排序相同if key_sorted == sorted(filtered_chars):return i + 1 # 返回匹配箱子的索引(從 1 開始)return -1 # 如果沒有匹配,返回 -1# 輸出結(jié)果
print(find_box_index(key, boxes))
java解法
- 解題思路
- 這段代碼的目標(biāo)是從一組字符串(containers)中找到第一個(gè)可以與輸入字符串 referenceKey 匹配的容器。匹配的條件是兩個(gè)字符串的字符完全相同(忽略大小寫和非字母字符),且字符順序無關(guān)。匹配時(shí)返回容器的索引(從 1 開始),如果找不到匹配則返回 -1。
代碼分為三個(gè)主要部分:
字符串預(yù)處理:過濾非字母字符,將字母轉(zhuǎn)換為小寫,并按字母順序排序。
匹配邏輯:將 referenceKey 和每個(gè)容器經(jīng)過相同的預(yù)處理后進(jìn)行比較。
輸出結(jié)果:根據(jù)匹配結(jié)果輸出第一個(gè)匹配容器的索引或 -1。
import java.util.Scanner;
import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 讀取輸入,預(yù)處理 referenceKeyString referenceKey = sanitizeAndSort(scanner.nextLine());// 讀取 containers 列表,按空格分隔String[] containers = scanner.nextLine().split(" ");// 查找匹配索引int matchingIndex = findMatchIndex(referenceKey, containers);// 輸出匹配結(jié)果System.out.println(matchingIndex);}/*** 預(yù)處理字符串:過濾非字母字符,轉(zhuǎn)為小寫,并排序** @param input 原始字符串* @return 經(jīng)過排序和過濾后的字符串*/private static String sanitizeAndSort(String input) {// 去除非字母字符,轉(zhuǎn)小寫,轉(zhuǎn)為字符數(shù)組char[] filteredChars = input.replaceAll("[^a-zA-Z]", "").toLowerCase().toCharArray();// 對(duì)字符數(shù)組排序Arrays.sort(filteredChars);// 轉(zhuǎn)為字符串返回return new String(filteredChars);}/*** 在 containers 中查找第一個(gè)匹配 referenceKey 的索引** @param referenceKey 預(yù)處理后的參考字符串* @param containers 容器字符串?dāng)?shù)組* @return 第一個(gè)匹配的容器索引(從 1 開始),未找到返回 -1*/private static int findMatchIndex(String referenceKey, String[] containers) {for (int i = 0; i < containers.length; i++) {// 預(yù)處理當(dāng)前容器String sortedBox = sanitizeAndSort(containers[i]);// 比較參考字符串與當(dāng)前容器是否匹配if (referenceKey.equals(sortedBox)) {return i + 1; // 返回 1 基索引}}return -1; // 沒有找到匹配,返回 -1}
}
C++解法
- 解題思路
更新中
C解法
更新中
JS解法
更新中
注意:
如果發(fā)現(xiàn)代碼有用例覆蓋不到的情況,歡迎反饋!會(huì)在第一時(shí)間修正,更新。
解題不易,如對(duì)您有幫助,歡迎點(diǎn)贊/收藏