数据结构算法 简单的面试思考题
?
目錄
簡單的面試思考題
思考題一
思考題二
思考題三
簡單的面試思考題
思考題一
?
有64瓶疫苗, 其中一瓶不小心混入了有害物質, 現在要利用小白鼠找出那一瓶!
注意:小白鼠只要喝一點點混入有害物質的在30分鐘就是死亡, 那么現在只剩下30分
鐘了(只能進行一次實驗), 問最少需要幾只小白鼠可以找出那瓶混入有害物質的疫苗
使用二進制編碼
1.將64瓶疫苗從0~63進行編號
2.將每一瓶疫苗的編號轉為二進制表示
package cn.itcast.test;
?
/*** Author itcast* Desc*/
public class Test01 {public static void main(String[] args){for (int i = 0; i <= 63; i++) {System.out.println(i+":"+Integer.toBinaryString(i));}}
}
?
00:000000
01:000001
02:000010
03:000011
04:000100
05:000101
06:000110
07:000111
08:000000
09:000001
10:000010
11:000011
12:000100
13:000101
14:000110
15:000111
16:010000
17:010001
18:010010
19:010011
20:010100
21:010101
22:010110
23:010111
24:011000
25:011001
26:011010
27:011011
28:011100
29:011101
30:011110
31:011111
32:100000
33:100001
34:100010
35:100011
36:100100
37:100101
38:100110
39:100111
40:101000
41:101001
42:101010
43:101011
44:101100
45:101101
46:101110
47:101111
48:110000
49:110001
50:110010
51:110011
52:110100
53:110101
54:110110
55:110111
56:111000
57:111001
58:111010
59:111011
60:111100
61:111101
62:111110
63:111111
-----------******
3.拿出6只小白鼠和上面的6個二進制位一一對應
4.然后這6只小白鼠喝對應的二進制位是1的疫苗(只喝一點點即可)
如左邊第一只,喝32~63
如右邊第一只,喝編號是奇數的
...其他的類似
5.30分鐘后觀察結果,看哪些小白鼠死了既可以推斷出混入有害物質的疫苗
如: 都沒死, 那么0號000000混入有害物質
如: 都死了, 那么63號111111混入有害物質
如: 從左邊開始135死了,那么 42號101010混入有害物質
-
原理:
現代科學實驗思想: 通過現象猜想本質 , 通過本質/原理,也可以推導可能發生的現象
-
如:
觀察到先看見閃電, 后聽到雷聲, 我猜想: 光速比聲速快
而事實也是確實是光速比聲速快,所以先看見閃電, 后聽到雷聲
?
?
思考題二
有 1~ n, n個數字(n很大,但不一定有序),
但是不小心丟了其中一個,
讓寫代碼找出丟的哪一個! 要求效率最高
-
可能的解法
1.排序+二分(效率太低,因為要排序)
2.先求1~n的和((1+n)*n/2)再減去n-1個數,最后的結果的數就是丟失的數(已經很快了,但是還是要進行加減法)
3.位運算比加減法還要快
&與
|或
!非
^異或
?
^異或的特點:
二進制:1001
^1001
-----00001001
^0110
------1111
所以異或的特點是二進制位相同為0,不同為1
那么推廣到1~n,相同的數據異或為0,不同的先不管1010
^0000
-----1010
一個數和0進行異或等于這個數本身
且異或滿足交換律,異或順序可以隨便調
?1 ^ 2 ^ 3 ....^n--這是有丟失的
^1 ^ 2 ^ 3 .x..^n--這是沒有丟失的
-----------------0^0^0....^x = x
?
代碼實現
package cn.itcast.test;
?
/*** Author itcast* Desc*/
public class Test02 {public static void main(String[] args) {int result = 0;int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//完整的int[] arr2 = new int[]{1, 2, 3, 4, 0, 6, 7, 8, 9, 10};//丟失了一個數的
?for (int i = 0; i < arr1.length; i++) {if (i == 0) {result = arr1[i] ^ arr2[i];} else {//result = result ^ (arr1[i] ^ arr2[i]);result ^= (arr1[i] ^ arr2[i]);}}
?System.out.println("丟失的數為:" + result);}
}
?
思考題三
有1個桶里面有100個黑球,100個白球, 桶外還有足夠的黑球白球
現在從桶里每次隨機取出2個球,
如果顏色相同就放回一個白球,
如果顏色不同就放回一個黑球,
問最后桶里剩下的一個球是什么顏色的球?
使用位運算異或^
相同為0,不同為1
所以令白球為0,黑球為1
那么題目就變成了100個0和100個1進行^
0 ^ 0 ^ 0....^ 0 ==0
1 ^ 1 ^ 1....^ 1 == 0
------------------
0是白球
?
package cn.itcast.test;
?
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
?
/*** Author itcast* Desc*/
public class Test03 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 1; i <= 100; i++) {list.add(0);//白球list.add(1);//黑球}Random random = new Random();while (list.size() > 1) {Integer i1 = list.get(random.nextInt(list.size()));Integer i2 = list.get(random.nextInt(list.size()));list.remove(i1);//移除該對象list.remove(i2);//移除該對象list.add(i1 ^ i2);}System.out.println(list);}
}
?
?
總結
以上是生活随笔為你收集整理的数据结构算法 简单的面试思考题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据Flink(四十五):
- 下一篇: 2021年大数据常用语言Scala(三十