LeetCode每日一題,20250914

元音拼寫檢查器

思路

  1. 精確匹配

    • HashSet 保存原始單詞,查詢時直接判斷是否存在。
  2. 大小寫忽略匹配

    • HashMap<String, String> 保存 小寫單詞 -> 第一次出現的原始單詞
    • putIfAbsent,確保只記錄第一次出現的單詞。
  3. 元音模糊匹配

    • 把單詞里所有元音替換為 *,得到模糊形式。
    • HashMap<String, String> 保存 模糊形式 -> 第一次出現的原始單詞
    • 查詢時同樣先轉小寫再模糊化,然后查表。

查詢優先級

  • 精確匹配 → 大小寫匹配 → 元音模糊匹配 → 否則返回 ""
class Solution {String vowels = "aeiou";public String[] spellchecker(String[] wordlist, String[] queries) {Set<String> wordSet = new HashSet<>();             // 精確匹配Map<String, String> caseMap = new HashMap<>();     // 忽略大小寫Map<String, String> vowelMap = new HashMap<>();    // 忽略元音// 預處理 wordlistfor (String word : wordlist) {wordSet.add(word);String lower = word.toLowerCase();caseMap.putIfAbsent(lower, word);String devoweled = devowel(lower);vowelMap.putIfAbsent(devoweled, word);}String[] ans = new String[queries.length];// 查詢for (int i = 0; i < queries.length; i++) {String query = queries[i];if (wordSet.contains(query)) {  // 精確匹配ans[i] = query;} else {String lower = query.toLowerCase();if (caseMap.containsKey(lower)) {  // 大小寫匹配ans[i] = caseMap.get(lower);} else {String devoweled = devowel(lower);ans[i] = vowelMap.getOrDefault(devoweled, "");}}}return ans;}// 把所有元音替換成 '*'private String devowel(String word) {StringBuilder sb = new StringBuilder();for (char c : word.toCharArray()) {if (vowels.indexOf(c) != -1) {sb.append('*');} else {sb.append(c);}}return sb.toString();}
}

方法二,用stream流

明白了,我幫你重整理,把 devowel 函數相關的語法(3,4,5)歸為一個類,同時去掉 6,7。這樣筆記更清晰、針對性更強。


import java.util.*;
import java.util.stream.*;class Solution {private final String vowels = "aeiou";public String[] spellchecker(String[] wordlist, String[] queries) {// 精確匹配Set<String> wordSet = new HashSet<>(Arrays.asList(wordlist));// 大小寫忽略,保存第一次出現的原始單詞Map<String, String> caseMap = Arrays.stream(wordlist).collect(Collectors.toMap(w -> w.toLowerCase(),w -> w,(oldVal, newVal) -> oldVal   // 保證第一次出現));// 元音忽略,保存第一次出現的原始單詞Map<String, String> vowelMap = Arrays.stream(wordlist).collect(Collectors.toMap(w -> devowel(w.toLowerCase()),w -> w,(oldVal, newVal) -> oldVal   // 保證第一次出現));// 查詢處理(用 stream 映射)return Arrays.stream(queries).map(q -> {if (wordSet.contains(q)) {return q; // 精確匹配}String lower = q.toLowerCase();if (caseMap.containsKey(lower)) {return caseMap.get(lower); // 忽略大小寫}return vowelMap.getOrDefault(devowel(lower), ""); // 忽略元音}).toArray(String[]::new);}// 把元音替換成 *private String devowel(String word) {return word.chars().mapToObj(c -> vowels.indexOf(c) != -1 ? "*" : String.valueOf((char) c)).collect(Collectors.joining());}
}

代碼解析

1?? 數組和 List 的區別

Set<String> wordSet = new HashSet<>(Arrays.asList(wordlist));
  • wordlist數組 (String[])
  • HashSet 構造函數需要 Collection 類型(List/Set 等),數組本身不是 Collection
  • Arrays.asList(wordlist) → 把數組轉成 List,方便初始化 Set
特性數組 (String[])List (List<String>)
大小固定可變
方法.lengthadd, remove, contains 等
接口不實現 Collection實現 Collection
可作為構造參數不可以可以

2?? Stream + Collectors.toMap(構建 Map)

Map<String, String> caseMap = Arrays.stream(wordlist).collect(Collectors.toMap(w -> w.toLowerCase(),      // key 映射規則w -> w,                    // value 映射規則(oldVal, newVal) -> oldVal // key 沖突時保留第一次出現));
  • Arrays.stream(wordlist) → 把數組轉成 Stream
  • Collectors.toMap(keyMapper, valueMapper, mergeFunction)
參數作用
keyMapperStream 元素如何生成 key (w -> w.toLowerCase())
valueMapperStream 元素如何生成 value (w -> w)
mergeFunctionkey 沖突時如何處理 (oldVal, newVal) -> oldVal → 保留第一次出現

示例

wordlist = {"KiTe", "kite", "Hare"}
Map -> {"kite" -> "KiTe", "hare" -> "Hare"}
  • 保證第一次出現的單詞被記錄,不被后續重復覆蓋

3?? devowel 函數解析(字符流 + 拼接)

private String devowel(String word) {return word.chars().mapToObj(c -> vowels.indexOf(c) != -1 ? "*" : String.valueOf((char) c)).collect(Collectors.joining());
}
3.1 word.chars()
  • 將字符串拆成 IntStream
  • 每個字符是 Unicode 編碼的 int
  • 示例:
"Hi".chars() -> 72, 105
3.2 String.valueOf((char) c)
  • chars() 返回的是 int
  • (char) c → 把 int 轉回字符
  • String.valueOf(char) → 把字符變成長度為 1 的字符串
  • 用于最終拼接
3.3 Collectors.joining()
  • 將 Stream 中的每個字符串 拼接成一個完整字符串
  • 內部使用 StringBuilder,不會像 s += c 那樣每次循環都生成新對象
  • 高效拼接字符串

? 總結 devowel 技巧

  1. word.chars() → 拆成字符流
  2. (char) c + String.valueOf() → 字符轉換成字符串
  3. Collectors.joining() → 高效拼接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97973.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

i2s_record_play

這章主要講述i2s 1&#xff1a;環境及配件 esp32c3 esp32s3 idf5.4.1 INMP441 MAX98357A 都使用dma 2&#xff1a;eps32c3 測試 只有1個i2s 只能一邊錄 完 再播放 &#xff0c;內存太小&#xff0c;這里用 flash 存audio里 只說能 錄音 能播放 &#xff0c;效果不好&#xff0…

Spring Boot 3 + EasyExcel 文件導入導出實現

SpringBoot集成EasyExcel 3.x&#xff1a;高效實現Excel數據的優雅導入與導出 在現代企業應用中&#xff0c;Excel作為數據交換的重要工具&#xff0c;幾乎無處不在。如何高效且優雅地實現Excel數據的導入與導出&#xff0c;是每個開發者都需要面對的問題。EasyExcel是阿里巴巴…

Ruby編程實踐:20個實用練習

1、編寫一個程序,計算一年有多少小時。 以下是兩種實現方式的代碼: 方式一: puts 24*365方式二: puts 24*365 puts "(or #{24*366} on a leap year)"2、編寫一個程序,計算十年中有多少分鐘。 以下兩種實現方式: 簡單計算(未考慮閏年數量差異): ru…

邏輯回歸(二):從原理到實戰 - 訓練、評估與應用指南

引言&#xff1a; 上期我們講了什么是邏輯回歸&#xff0c;了解了它如何利用Sigmoid函數將線性回歸的輸出轉化為概率&#xff0c;并通過最大似然估計來尋找最佳參數。今天&#xff0c;我們將繼續這段旅程&#xff0c;學習如何訓練這個 模型、如何評估它的表現&#xff0c;以及如…

9.8C++作業

思維導圖#include <iostream> #include <vector> #include <fstream> using namespace std;class Stu {friend ofstream &operator<<(ofstream &ofs,const Stu &stu); private:string name;string id;int age;double score; public:Stu(){…

Linux內存管理章節十六:非均勻的內存訪問:深入Linux NUMA架構內存管理

引言 在傳統的SMP&#xff08;對稱多處理&#xff09;系統中&#xff0c;所有CPU核心通過一條共享總線訪問同一塊內存&#xff0c;所有內存訪問延遲是均勻的&#xff08;UMA&#xff09;。然而&#xff0c;隨著CPU核心數量的增加&#xff0c;共享總線成為了巨大的性能和 scalab…

【論文翻譯】Seg-Zero: Reasoning-Chain Guided Segmentation via Cognitive Reinforcement

0. 摘要Traditional methods for reasoning segmentation rely on supervised fine-tuning with categorical labels and simple descriptions, limiting its out-of-domain generalization and lacking explicit reasoning processes. To address these limitations, we propo…

Playwright MCP瀏覽器自動化教程

你是否曾厭倦在編程軟件和瀏覽器之間反復切換&#xff0c;只為了檢查AI生成的代碼能否正常運行&#xff1f;現在&#xff0c;有了Playwright MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;你可以直接讓AI自己操作瀏覽器&#xff0c;查看自己寫的代碼運行效果…

矩陣中遍歷某個點周圍的九個點

又是學習新知識的一天,以下為Java版本部分關鍵代碼int[] neighbors {0, 1, -1};int rows board.length;int cols board[0].length;int[][] copyBoard new int[rows][cols];for (int row 0; row < rows; row) {for (int col 0; col < cols; col) {int liveNeighbors…

單例模式:只有一個對象

目錄 什么是單例模式 能解決什么問題 使用場景 如何實現 __new__ 方法&#xff1a;經典又直接 裝飾器&#xff1a;不改類本身&#xff0c;也能單例 模塊本身就是單例 注意事項 總結 你有沒有過這樣的困擾&#xff1a; “為什么我明明只創建了一次數據庫連接&#xff0…

AI大模型學習(6)Yolo V8神經網絡的基礎應用

Yolo V8神經網絡的基礎應用2024-2025年最火的目標檢測神器&#xff0c;一篇文章讓你徹底搞懂&#xff01;&#x1f929;大家好呀&#xff01;今天我們要聊一聊計算機視覺領域的「明星模型」——YOLO神經網絡&#xff01;&#x1f3af; 如果你對「目標檢測」這個詞還比較陌生&am…

C++:imagehlp庫

imagehlp庫1. 簡介2. 主要函數與用途2.1PE 文件解析相關2.2 符號處理相關2.3 崩潰轉儲相關2.4 版本資源相關3. 使用示例3.1 解析內存地址對應的函數名和行號3.2 創建目錄使用示例1. 簡介 imagehlp 是 Windows 系統提供的一個圖像處理與調試輔助 API 庫&#xff08;Image Helpe…

如何在Anaconda中配置你的CUDA Pytorch cuNN環境(2025最新教程)

目錄 一、簡介 二、下載CUDA 三、下載Pytorch-GPU版本 四、下載CUDNN 五、總結 六、測試代碼 一、簡介 啥是Anaconda?啥是CUDA?啥是CUDNN&#xff1f;它們和Pytorch、GPU之間有啥關系? 怎么通俗解釋它們三者的用途和關系&#xff1f; 1.GPU(圖形處理單元&#xff09…

算法面試(1)-----目標檢測和圖像分類、語義分割的區別

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 目標檢測&#xff08;Object Detection&#xff09;、圖像分類&#xff08;Image Classification&#xff09;、語義分割&#xff08;Semantic Segmentation&#xff09; 是計算機視…

電腦散熱風扇有噪音怎么解決

一、初步檢查與清理斷電并拆機關閉電腦并拔掉電源&#xff0c;打開機箱側板&#xff08;筆記本需先拆除后蓋螺絲&#xff09;。操作前建議佩戴防靜電手環&#xff0c;避免靜電損壞硬件。清理風扇及散熱片灰塵使用壓縮空氣罐從風扇進風口吹走灰塵&#xff0c;或用軟毛刷輕輕刷去…

SeaweedFS深度解析(九):k8s環境使用helm部署Seaweedfs集群

上一篇&#xff1a;《SeaweedFS深度解析&#xff08;八&#xff09;&#xff1a;k8s環境使用Operator部署Seaweedfs集群》 鏈接: link #作者&#xff1a;閆乾苓 文章目錄k8s環境使用helm部署Seaweedfs集群準備鏡像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB繪制一個新穎的混沌圖像(新四翼混沌系統)

新四翼混沌系統:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代碼:function plot_novel_chaotic_system() % 參數設置 a 10; b 8/3; c 28;% 初始條件 x0 [1, 1, 1];% 時間范圍 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融數據---獲取股票日線數據

獲取股票日線的數據方式有很多&#xff0c;包括東方財富&#xff0c;同花順&#xff0c;tushare&#xff0c;這里我們就利用東方財富的數據&#xff0c;是免費的開源獲取&#xff0c;第一步先安裝akshare&#xff0c;pip安裝就可以py -m pip install akshareAkshare 股票數據獲…

Mac 真正多顯示器支持:TESmart USB-C KVM(搭載 DisplayLink 技術)如何實現

多顯示器已經不再是奢侈品&#xff0c;而是專業人士提升生產力的必需工具。無論是創意設計師、股票交易員還是軟件開發人員&#xff0c;多屏幕都能讓工作流程更高效、更有條理。 然而&#xff0c;Mac 用戶長期以來面臨一個主要障礙&#xff1a;macOS 原生不支持多流傳輸&#x…

【實時Linux實戰系列】靜態鏈接與libc選擇:musl vs glibc的時延權衡

背景與重要性 在實時系統開發中&#xff0c;選擇合適的C標準庫&#xff08;libc&#xff09;和鏈接方式對系統的啟動時間、線程性能和內存分配效率有著顯著影響。glibc和musl是兩種流行的C標準庫實現&#xff0c;它們在設計目標和性能表現上存在差異。通過對比這兩種libc在啟動…