據(jù)說華為的一道面試題

刷微博,看到一道面試題:
先說一下思路
默認(rèn)題意為不能取重復(fù)的數(shù)字
總體來說,就是從可行解空間[1,1]~[20,20]中,逐步過濾,找到最終答案的過程。說一下過濾步驟:
- 首先A不確定兩個(gè)數(shù)字,所以兩數(shù)之和sum滿足:4<=sum<=38
- 其次B也不確定,所以兩數(shù)之積的分解方式可能有多種(本來以為可以用質(zhì)因子個(gè)數(shù)>2來判別的,但是后來發(fā)現(xiàn)還要考慮兩數(shù)在1到20之間)
- A知道數(shù)字了,所以sum的所有分解方式中,只有一個(gè)是讓B不能確定的,即i+j=sum,切i*j的分解方式不止一種
- 這一步比較難:B知道乘積prod,對于prod分解的所有可能,都能得到其和sum,如果sum的所有分解中,只有一個(gè)是讓B不能確定的;而且prod的分解只有一個(gè)是滿足此關(guān)系的。則當(dāng)前的prod,以及對應(yīng)的讓B不能確定的prod分解,即為所求解。
1和2很容易理解。3的話,如果sum的諸多分解方式中,都能被B確定,即i*j只能唯一分解,那B就不會說不知道數(shù)字了。如果sum的諸多分解方式中,有多個(gè)不能被B確定,那A在第三步就不能確定數(shù)字了,因?yàn)锳拿不準(zhǔn)B是在哪一組i*j中。
4,B知道乘積prod,假設(shè)可以分解為 I_n, J_n 。對于每一組 I_n, J_n: 和為sum=I_n+J_n,且A知道這個(gè)sum,這時(shí)B推測sum可以分解為i_n+j_n: 由于3的結(jié)論,所以sum對應(yīng)的i_n*j_n的分解不唯一的情況只有一個(gè) 如果sum對應(yīng)的i_n*j_n分解不唯一的情況為0個(gè),那么B在第二步就可以猜出 如果sum對應(yīng)的i_n*j_n分解不唯一的情況多于1個(gè),那么A在第三步就猜不出來了 在所有的 I_n, J_n 中,滿足如上條件的只有一個(gè) 如果都滿足上述條件的多于一個(gè),那么B在最后一步就無法確定哪一組I_n,J_n是正確答案了
當(dāng)然,第四步也是在第三步的結(jié)果上過濾的
好,接下來就是寫代碼了
代碼
// from http://www.robberphex.com/interview-question-from-huawei/ import java.util.*; public class Main { public static void main(String[] args) { Map<Integer, List<List<Integer>>> sumCount = new HashMap<>(); Map<Integer, List<List<Integer>>> prodCount = new HashMap<>(); Set<List<Integer>> candidates = new HashSet<>(); for (int i = 1; i <= 20; i++) { for (int j = i + 1; j <= 20; j++) { // 第一步,A猜不出來 if (i + j < 4 || i + j > 38) { continue; } List<List<Integer>> sumCnt = sumCount.getOrDefault(i + j, new ArrayList<>()); sumCnt.add(Arrays.asList(i, j)); sumCount.put(i + j, sumCnt); List<List<Integer>> prodCnt = prodCount.getOrDefault(i * j, new ArrayList<>()); prodCnt.add(Arrays.asList(i, j)); prodCount.put(i * j, prodCnt); } } for (Map.Entry<Integer, List<List<Integer>>> entry : sumCount.entrySet()) { // 第二步,B猜不出來 int cnt = 0; List<Integer> res = null; if (entry.getValue().size() > 1) { for (List<Integer> list : entry.getValue()) { if (prodCount.get(list.get(0) * list.get(1)).size() > 1) { res = list; cnt++; } } } // 第三步,A猜出來了 if (cnt == 1) { candidates.add(res); } } //第四步,從第三步拿到的candidates中,過濾 for (List<Integer> num : candidates) { int poss = 0; for (List<Integer> prodNum : prodCount.get(num.get(0) * num.get(1))) { int cnt = 0; for (List<Integer> sumNum : sumCount.get(prodNum.get(0) + prodNum.get(1))) { if (prodCount.get(sumNum.get(0) * sumNum.get(1)).size() > 1) { cnt++; } } if (cnt == 1) { poss++; } } if (poss == 1) { System.out.println(num); } } } }
答案
算出來的答案有三組:
[2, 3]
[2, 4]
[9, 20]
當(dāng)然,也有人說如果可以取重復(fù)的數(shù)字呢,那么只需要修改第11行就可以了,這時(shí)答案變?yōu)椋?/p>
[2, 2]
[9, 20]
當(dāng)然,這個(gè)思路也僅僅是我不成熟的想法,我也很難完整的證明這個(gè)解法是正確的。如果發(fā)現(xiàn)其中有錯(cuò)誤的地方,請?jiān)u論指出,謝謝!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖
這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-07-16- JS 初學(xué)者總是對this關(guān)鍵字感到困惑,因?yàn)榕c其他現(xiàn)代編程語言相比,JS 中的這this關(guān)鍵字有點(diǎn)棘手。今天小編給大家?guī)?0個(gè)比較流行的JavaScript面試題 ,感興趣的朋友一起2019-07-12
2019校招Java 開發(fā)崗面試知識點(diǎn)解析(附最新筆面試題)
這篇文章主要介紹了2019校招Java 開發(fā)崗面試知識點(diǎn)解析(附最新筆面試題),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-27- 這篇文章主要介紹了面試必備之Java 最常見 200+ 面試題全解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-13
2019年成功入職阿里:阿里的三套Java研發(fā)崗面試題總結(jié)
之前過了幾個(gè)簡單的簡歷面,所以總結(jié)了幾套面試的試題供大家分享。小編覺得挺不錯(cuò)的,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-25金九銀十,各大互聯(lián)網(wǎng)公司Java面試題合集
又到了面試求職高峰期,最近有很多網(wǎng)友都在求大廠面試題。這些題目是網(wǎng)友去百度、小米、樂視、美團(tuán)、58、獵豹、360、新浪、搜狐等一線互聯(lián)網(wǎng)公司面試被問到的題目,發(fā)上來2019-04-24- 面試一直是大家關(guān)注的問題,包括最近有很多人跟我講投了很多簡歷出去,就像泥牛入海一樣了無音訊了,今天我就來分享一個(gè)Java程序員面試拼多多后端開發(fā)崗位的幾輪面試題。2019-04-24
精選11道Java技術(shù)面試題及對應(yīng)答案【包含部分阿里和華為的面試題】
這篇文章主要為大家介紹了11道Java技術(shù)面試題及對應(yīng)答案,其中包含部分阿里和華為的面試題,總結(jié)分析了java常見的技術(shù)難點(diǎn)與java常見面試題,需要的朋友可以參考下2019-04-11春招開掛!208個(gè)最常見 Java面試題全解析(面試必備)
最近正值春招, 本文就把收集平時(shí)遇到的 Java 技術(shù)問題或周圍朋友見過的面試題分享給大家,題庫中所有的問題請看下文,考驗(yàn)?zāi)闼降臅r(shí)候到了。感興趣的可以了解一下2019-04-11- JVM(Java 虛擬機(jī))算是面試必問的問題的了,而但凡問 JVM 一定會問的第一個(gè)問題就是:講一講 JVM 的組成?那本文就注重講一下 JVM 的組成,感興趣的可以了解一下2019-04-10