題目描述
題目解釋:給一個(gè)整數(shù)陣列 nums, 裡面只有一個(gè)數(shù)字出現(xiàn)一次坎炼,其他都是出現(xiàn)兩次案疲,找出那個(gè)孤單的數(shù)字芥喇。
Step 1: 新增測(cè)試用例权逗,只有一個(gè)整數(shù)時(shí)病往,回傳該整數(shù)捣染。nums_is_5_singleNumber_should_be_5
測(cè)試代碼:
測(cè)試代碼
生產(chǎn)代碼:
尚未實(shí)作的生產(chǎn)代碼
Step 2: Hard-code return nums[0] 以通過(guò)測(cè)試用例
生產(chǎn)代碼:先直接回傳 nums[0]
以通過(guò)測(cè)試用例
hard-code 通過(guò)測(cè)試用例
重構(gòu)測(cè)試代碼:[Extract Method] AssertSingleNumber()
重構(gòu)測(cè)試:擷取驗(yàn)證方法
Step 3: 新增測(cè)試用例,nums_is_454_singleNumber_should_be_5
測(cè)試代碼:整數(shù)陣列長(zhǎng)度增加到 3停巷。
長(zhǎng)度為 3 的測(cè)試用例
生產(chǎn)代碼:使用 Dictionary
來(lái)存放每個(gè)數(shù)字出現(xiàn)的次數(shù)為奇數(shù)還是偶數(shù)耍攘。
用 Dictionary 紀(jì)錄數(shù)字出現(xiàn)次數(shù)為奇數(shù)還是偶數(shù)
Step 4: 新增通過(guò)的測(cè)試用例
測(cè)試用例:
[TestMethod]
public void nums_is_454_singleNumber_should_be_5()
{
var nums = new int[] { 4, 5, 4 };
AssertSingleNumber(nums, 5);
}
[TestMethod]
public void nums_4_2_4_7_2_singileNumber_should_be_7()
{
var nums = new int[] { 4, 2, 4, 7, 2 };
AssertSingleNumber(nums, 7);
}
題目有說(shuō)明榕栏,不希望用到額外的記憶體來(lái)處理,因此 Dictionary 是不符合題目規(guī)定的蕾各。
Step 5: 重構(gòu)演算法扒磁,改用 XOR 處理,找出孤單的數(shù)字
XOR 的特色是式曲,某個(gè)數(shù)字 XOR 偶數(shù)次妨托,會(huì)得到全都是 0 的結(jié)果。最後剩下的吝羞,就是孤單的數(shù)字兰伤。
生產(chǎn)代碼:
public class Solution
{
public int SingleNumber(int[] nums)
{
int result = 0;
for (int i = 0; i < nums.Length; i++)
{
result = result ^ nums[i];
}
return result;
}
}
通過(guò) LeetCode 上所有測(cè)試用例
通過(guò) LeetCode 所有 test cases
結(jié)論
就是考你 XOR
的特性,沒(méi)啥太大意義脆贵。但練手感跟思路還是不錯(cuò)的医清。
GitHub commit history: LeetCode_136_Single_Number