2020-11-18,快速?gòu)淖址當(dāng)?shù)組中找出符合要求的兩個(gè)數(shù)字

給定一個(gè)數(shù)字字符串?dāng)?shù)組弯囊,要求選取其中任意兩個(gè)字符串兩兩組合痰哨,選取的字符串中包含0-9的所有數(shù)字,找出符合要求的組合的總數(shù)

例如:

123456匾嘱,112233445566斤斧,123789,546821奄毡,025975折欠,15840911115600,5454545454522222211111

說(shuō)明:

該問(wèn)題的難點(diǎn)在于當(dāng)給定數(shù)字字符串較多時(shí),例如10萬(wàn)個(gè)字符串锐秦,判斷時(shí)間容易較長(zhǎng)咪奖,必須進(jìn)行優(yōu)化,短時(shí)間內(nèi)給出結(jié)果

解決思路:

將給定字符串?dāng)?shù)組全部轉(zhuǎn)換為數(shù)字組合的數(shù)組

例如:字符串123456酱床,可以轉(zhuǎn)換為1羊赵,2,3扇谣,4昧捷,5,6的集合

字符串罐寨,112233445566也可以轉(zhuǎn)換為1靡挥,2,3鸯绿,4跋破,5,6的集合

這樣我們只需對(duì)1瓶蝴,2毒返,3,4舷手,5拧簸,6的集合進(jìn)行判斷,這樣會(huì)大大降低運(yùn)算的數(shù)量

// Complete the winningLotteryTicket function below.

//數(shù)字字符串?dāng)?shù)組,兩兩組合,包含0-9的所有數(shù)字翼虫,找出符合要求的組合的總數(shù)

static long winningLotteryTicket(String[] tickets) {

Map, Integer> map =new HashMap<>();

//解析所有字符串為數(shù)字集合并計(jì)數(shù)凝危,這么處理會(huì)極大的降低需要處理的集合的數(shù)量

//此方法在數(shù)據(jù)量極大時(shí),會(huì)大幅度降低需要處理的數(shù)據(jù)的數(shù)量

Arrays.stream(tickets)

.forEach(ticket -> {

List numList =strToInt(ticket);

Integer cnt =map.get(numList);

cnt =null == cnt ?0 : cnt;

cnt++;

map.put(numList, cnt);

});

List> list =new ArrayList<>(map.keySet());

//集合中數(shù)字兩兩判斷,是否包含0-9的所有數(shù)字

//注:若單個(gè)結(jié)合本身就包含0-9的所有數(shù)字,需要做特殊處理

long totalSum = IntStream.range(0, list.size())

.mapToLong(i -> {

List listA =list.get(i);

long

countA =map.get(listA);

if

(isHasAll(listA)) {

long sum = IntStream.range(i +1, list.size())

.mapToLong(a ->map.get(list.get(a)))

.sum();

long

total = countA * sum;

total += LongStream.range(1, countA)

.sum();

return

total;

}

long sum = IntStream.range(i +1, list.size())

.filter(j ->isHasAll(listA, list.get(j)))

.mapToLong(j ->map.get(list.get(j)))

.sum();

return

countA * sum;

})

.sum();

return

totalSum;

}

/**

* 字符串轉(zhuǎn)換為數(shù)字集合,需去重兔乞,排序

*@param numStr

* @return

*/

private static List<Integer> strToInt(String numStr) {

return IntStream.range(0, numStr.length())

.map(i -> Integer.

parseInt(numStr.substring(i, i + 1)))

.distinct()

.sorted()

.boxed()

.collect(Collectors.

toList());

}

/**

* 判斷兩個(gè)數(shù)字結(jié)合是否包含0-9的所有數(shù)字

* @paramintsI

* @param intsJ

* @return

*/

public static boolean isHasAll(List<Integer> intsI, List intsJ) {

int[] buffer = IntStream.rangeClosed(0, 9)

.filter(i -> !

intsI.contains(i))

.toArray()

;

int[] result = Arrays.stream(buffer)

.filter(i -> !

intsJ.contains(i))

.toArray()

;

return null== result || result.length == 0;

}

/**

* 判斷單個(gè)數(shù)字結(jié)合是否包含0-9的所有數(shù)字

* @paramintsI

* @return

*/

public static boolean isHasAll(List intsI) {

int[] result = IntStream.rangeClosed(0, 9)

.filter(i -> !

intsI.contains(i))

.toArray()

;

return null== result || result.length == 0;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凉唐,隨后出現(xiàn)的幾起案子庸追,更是在濱河造成了極大的恐慌,老刑警劉巖台囱,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淡溯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡簿训,警方通過(guò)查閱死者的電腦和手機(jī)咱娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門米间,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人膘侮,你說(shuō)我怎么就攤上這事屈糊。” “怎么了琼了?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵逻锐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雕薪,道長(zhǎng)昧诱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任所袁,我火速辦了婚禮盏档,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纲熏。我一直安慰自己妆丘,他們只是感情好锄俄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布局劲。 她就那樣靜靜地躺著,像睡著了一般奶赠。 火紅的嫁衣襯著肌膚如雪鱼填。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天毅戈,我揣著相機(jī)與錄音苹丸,去河邊找鬼。 笑死苇经,一個(gè)胖子當(dāng)著我的面吹牛赘理,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇单,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼商模,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蜘澜?” 一聲冷哼從身側(cè)響起施流,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鄙信,沒(méi)想到半個(gè)月后瞪醋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡装诡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年银受,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了践盼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宾巍,死狀恐怖宏侍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜀漆,我是刑警寧澤谅河,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站确丢,受9級(jí)特大地震影響绷耍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲜侥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一褂始、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧描函,春花似錦崎苗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至互墓,卻和暖如春必尼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篡撵。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工判莉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育谬。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓券盅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膛檀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锰镀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容