åˆæ˜¯ä¸€é“喜闻ä¹è§çš„é¢è¯•题,分三个难度
å‘Šè¯‰ä½ n个数,其ä¸åªæœ‰ä¸€ä¸ªæ•°åªå‡ºçŽ°äº†ä¸€æ¬¡ï¼Œå…¶ä»–æ‰€æœ‰çš„æ•°éƒ½å‡ºçŽ°äº†ä¸¤æ¬¡ï¼Œæ±‚è¿™ä¸€ä¸ªæ•°
一切都æºäºŽè¿™é“题,一é“平凡的题由于巧妙了利用了异或的性质而大放异彩,解ç”:
int m = 0;
for(int i = 0; i < n; ++i){
m = m ^ N[i];
}
return m;
å‘Šè¯‰ä½ nä¸ªæ•°ï¼Œå…¶ä¸æœ‰ä¸¤ä¸ªæ•°åªå‡ºçŽ°äº†ä¸€æ¬¡ï¼Œå…¶ä»–æ‰€æœ‰æ•°éƒ½å‡ºçŽ°äº†ä¸¤æ¬¡ï¼Œæ±‚è¿™ä¸¤ä¸ªæ•°
比刚æ‰é‚£é“题难了一点,ä¸è¿‡å¤§åŒå°å¼‚,ä¾ç„¶æ˜¯å°†å·¦å³æ•°éƒ½å¼‚或一éï¼Œå‰©ä¸‹çš„æ•°ä¸€å®šæ˜¯è¿™ä¸¤ä¸ªåªæœ‰ä¸€ä¸ªçš„æ•°çš„异或
å› ä¸ºä¸¤ä¸ªæ•°ä¸åŒï¼Œè¿™ä¸ªæ•°ä¸€å®šä¸æ˜¯0。这个数的二进制表示ä¸å¿…æœ‰ä¸€ä½æ˜¯1,这两个数必定在这一ä½ä¸Šæœ‰æ‰€ä¸åŒã€‚
将所有数分æˆä¸¤ç»„,一组在该ä½ä¸Šä¸º0,一组在该ä½ä¸Šä¸º1
两组分别å†è¿›è¡Œå¼‚或,将求出两个数
å‘Šè¯‰ä½ n个数,其ä¸åªæœ‰ä¸€ä¸ªæ•°åªå‡ºçŽ°äº†ä¸€æ¬¡ï¼Œå…¶ä»–æ‰€æœ‰çš„æ•°éƒ½å‡ºçŽ°äº†ä¸‰æ¬¡ï¼Œæ±‚è¿™ä¸€ä¸ªæ•°
åˆéš¾äº†ä¸€ç‚¹ç‚¹ï¼Œéœ€è¦ç”¨åˆ°æŒ‰ä½éžçš„è¿ç®—,解ç”:
int ones = 0; // å‡ºçŽ°ä¸€æ¬¡çš„æ ‡å¿—ä½
int twos = 0; // å‡ºçŽ°ç¬¬äºŒæ¬¡æ ‡å¿—ä½
for(int i = 0; i < n; i++) {
ones = (ones ^ A[i]) & ~twos; // ç¬¬ä¸€æ¬¡å‡ºçŽ°çš„åŠ ä¸Š, 第二次出现的去掉, 第三次出现的ä¸å˜
twos = (twos ^ A[i]) & ~ones; // 第一次出现的ä¸å˜, ç¬¬äºŒæ¬¡å‡ºçŽ°çš„åŠ ä¸Š, 第三次出现的去掉
}
return ones;
看ç€å¾ˆéš¾ï¼Œæœ¬è´¨å°±ä¸€å¥è¯ï¼ŒæŠŠå·²ç»å‡ºçŽ°ä¸¤æ¬¡çš„åœ¨onesä¸åŽ»æŽ‰,在twosä¸è®°å½•下æ¥