Java實(shí)現(xiàn)將字符串中的星號(hào)*替換為0-9中的數(shù)字
需求
將輸入的字符串中的星號(hào)替換為0-9中的數(shù)字,并返回所有可能的替換結(jié)果,允許存在多個(gè)*
號(hào)。
分析: 在每個(gè)星號(hào)位置,我們需要進(jìn)行 0-9 的循環(huán)遍歷,因此每個(gè)星號(hào)位置都有 10 種可能性。如果字符數(shù)組中有k個(gè)星號(hào),那么總共有 10k 個(gè)可能的替換結(jié)果。
即輸入12345*
時(shí),我們會(huì)得到 10 個(gè)結(jié)果,期望的結(jié)果如下:
123450
123451
123452
123453
123454
123455
123456
123457
123458
123459
輸入1234**
時(shí),我們會(huì)得到 100 個(gè)結(jié)果,期望的結(jié)果如下:
123400
123401
123402
......
123499
輸入******
時(shí),我們會(huì)得到 1000000 個(gè)結(jié)果。
解決方案
我們可以使用遞歸方式來(lái)依次實(shí)現(xiàn)將字符串中的星號(hào)替換為 0-9 的數(shù)字。
/** * 將輸入的字符串中的星號(hào)替換為0-9中的數(shù)字,并返回所有可能的替換結(jié)果 * @param input 輸入的字符串 * @return 所有可能的替換結(jié)果 */ public static List<String> replaceStars(String input) { List<String> result = new ArrayList<>(); int index = input.indexOf('*'); // 找到第一個(gè)星號(hào)的位置 if (index == -1) { // 如果字符串中沒(méi)有星號(hào) result.add(input); // 直接將原字符串添加到結(jié)果列表中 } else { for (int i = 0; i < 10; i++) { // 循環(huán)0-9中的數(shù)字 // 將星號(hào)替換為當(dāng)前數(shù)字 String replaced = input.substring(0, index) + i + input.substring(index + 1); // 對(duì)替換后的字符串再次調(diào)用replaceAsterisks方法,直到字符串中不再有星號(hào) result.addAll(replaceStars(replaced)); } } return result; }
代碼中的replaceStars
方法會(huì)首先查找輸入字符串中的第一個(gè)星號(hào)的位置。
如果找不到星號(hào),表示已經(jīng)完成了一次替換,將當(dāng)前字符串添加到結(jié)果列表中;
否則,就用 0-9 中的數(shù)字依次替換星號(hào),并對(duì)替換后的字符串再次調(diào)用replaceStars
方法,直到字符串中不再有星號(hào)。
最后收集并返回所有的替換結(jié)果。
代碼優(yōu)化
我們可以通過(guò)下標(biāo)索引追蹤當(dāng)前要處理的字符索引。
優(yōu)化后如下:
/** * 遞歸輔助函數(shù),用于將字符數(shù)組中的星號(hào)替換為0-9之間的數(shù)字 * @param chars 字符數(shù)組 * @param index 當(dāng)前處理的字符索引 * @param result 存儲(chǔ)替換結(jié)果的列表 */ private static void replaceStars(char[] chars, int index, List<String> result) { if (index == chars.length) { // 如果已經(jīng)處理完了所有字符 result.add(new String(chars)); // 將字符數(shù)組轉(zhuǎn)換為字符串并添加到結(jié)果列表中 return; } if (chars[index] == '*') { // 如果當(dāng)前字符是星號(hào) for (char c = '0'; c <= '9'; c++) { // 循環(huán)0-9中的數(shù)字 chars[index] = c; // 將星號(hào)替換為當(dāng)前數(shù)字 replaceStars(chars, index + 1, result); // 繼續(xù)處理下一個(gè)字符 } chars[index] = '*'; // 恢復(fù)星號(hào),以便處理下一個(gè)星號(hào) } else { replaceStars(chars, index + 1, result); // 如果當(dāng)前字符不是星號(hào),則繼續(xù)處理下一個(gè)字符 } }
首先判斷是否已經(jīng)處理完了所有字符,即index
是否等于chars
數(shù)組的長(zhǎng)度。如果是,則表示已經(jīng)處理完所有字符,此時(shí)將字符數(shù)組轉(zhuǎn)換為字符串并添加到結(jié)果列表result
中,然后返回。
如果當(dāng)前字符是星號(hào),就需要將星號(hào)替換為 0-9 之間的數(shù)字。通過(guò)一個(gè)循環(huán)遍歷 0-9 中的數(shù)字,每次將星號(hào)替換為當(dāng)前數(shù)字,并遞歸調(diào)用自身處理下一個(gè)字符(即將index
加1)。這樣會(huì)產(chǎn)生多次遞歸調(diào)用,每次調(diào)用都會(huì)處理下一個(gè)星號(hào)位置的數(shù)字替換。
在循環(huán)結(jié)束后,需要恢復(fù)星號(hào),以便處理下一個(gè)星號(hào)位置的數(shù)字替換。
如果當(dāng)前字符不是星號(hào),則直接遞歸調(diào)用自身,繼續(xù)處理下一個(gè)字符。
效率分析對(duì)比
優(yōu)化前后的方法效率對(duì)比如下:
執(zhí)行次數(shù) | 數(shù)據(jù)量 | 花費(fèi)時(shí)間(ms) | [優(yōu)化]花費(fèi)時(shí)間(ms) |
---|---|---|---|
1 | 10 | 0 | 0 |
2 | 102 | 0 | 0 |
3 | 103 | 3 | 0 |
4 | 104 | 7 | 1 |
5 | 105 | 44 | 6 |
6 | 106 | 238 | 42 |
本文所實(shí)現(xiàn)方法的時(shí)間復(fù)雜度是 O(10k),其中 k 是字符數(shù)組中星號(hào)的數(shù)量。
隨著星號(hào)數(shù)量的增加,可能的替換結(jié)果數(shù)量呈指數(shù)級(jí)增長(zhǎng),那么這個(gè)方法會(huì)變得非常耗時(shí)。因此,在處理具有大量星號(hào)的字符數(shù)組時(shí),考慮到時(shí)間復(fù)雜度的增長(zhǎng),需要優(yōu)化算法處理。
知識(shí)延展
Java如何將字符串中的敏感詞替換為相等數(shù)量的星號(hào)*
Java如何將字符串中的敏感詞替換為相等數(shù)量的星號(hào)*,這也是工作中遇到的問(wèn)題,嘗試了很多種方式最后采用這一種,在這里分享一下我的解決方式,方式簡(jiǎn)單,希望對(duì)大家有用。如果大家有什么好的方式也歡迎分享!
/** * 過(guò)濾字符串中的敏感詞匯 * @param content 文本 * @param sensitiveWord 敏感詞匯 * @return */ public String filterSensitiveWords(String content, String sensitiveWord) { if (content == null || sensitiveWord == null) { return content; } //獲取和敏感詞匯相同數(shù)量的星號(hào) String starChar = getStarChar(sensitiveWord.length()); //替換敏感詞匯 return content.replace(sensitiveWord, starChar); } //大部分敏感詞匯在10個(gè)以內(nèi),直接返回緩存的字符串 public static String[] starArr={"*","**","***","****","*****","******","*******","********","*********","**********"}; /** * 生成n個(gè)星號(hào)的字符串 * @param length * @return */ private static String getStarChar(int length) { if (length <= 0) { return ""; } //大部分敏感詞匯在10個(gè)以內(nèi),直接返回緩存的字符串 if (length <= 10) { return starArr[length - 1]; } //生成n個(gè)星號(hào)的字符串 char[] arr = new char[length]; for (int i = 0; i < length; i++) { arr[i] = '*'; } return new String(arr); }
到此這篇關(guān)于Java實(shí)現(xiàn)將字符串中的星號(hào)*替換為0-9中的數(shù)字的文章就介紹到這了,更多相關(guān)Java字符串替換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
全面解析Java支持的數(shù)據(jù)類(lèi)型及Java的常量和變量類(lèi)型
這篇文章主要介紹了Java支持的數(shù)據(jù)類(lèi)型及Java的常量和變量類(lèi)型,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-02-02一文搞懂SpringBoot如何利用@Async實(shí)現(xiàn)異步調(diào)用
異步調(diào)用幾乎是處理高并發(fā),解決性能問(wèn)題常用的手段,如何開(kāi)啟異步調(diào)用?SpringBoot中提供了非常簡(jiǎn)單的方式,就是一個(gè)注解@Async。今天我們重新認(rèn)識(shí)一下@Async,以及注意事項(xiàng)2022-09-09springboot + mybatis + druid + 多數(shù)據(jù)源的問(wèn)題詳解
這篇文章主要介紹了springboot + mybatis + druid + 多數(shù)據(jù)源的問(wèn)題詳解,示例代碼文字相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09IntelliJ?IDEA?2020.2.3永久破解激活教程(親測(cè)有效)
intellij?idea?2022是一款市面上最好的JAVA?IDE編程工具,該工具支持git、svn、github等版本控制工具,整合了智能代碼助手、代碼自動(dòng)提示等功能,本教程給大家分享IDEA?2022最新永久激活碼,感興趣的朋友參考下吧2020-10-10