Day40:数组中只出现一次的数字

时间:2022-07-24
本文章向大家介绍Day40:数组中只出现一次的数字,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——数组中只出现一次的数字

题目描述:

一个整型数组里除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体实现:

思路一:   如果把数组中的所有数字都依次异或一遍,则可以消掉成对出现的数字,那么还有两个数字是单一的,肯定也不同,那么最终异或的结果肯定不是0。表示在二进制中肯定有一位是1,那么两个不同的数字,一定有一个在该位为1,另一个在该位为0。如果将整个数组按照该位是否为1分为两部分,那么这两部分各自包含一个单一数字。这里实现这个就需要设置一个flag标志位,通过对其**左移动来实现。flag<<= 1;或者是flag=flag*2;分为两部分的数组,分别异或,最终结果就是这两个数。这里需要注意的是这个flag就是我们一个额外的条件,按照条件查找,边查找,边异或就行了。**具=具体用Java实现如下:

public class Solution{
    public void FindNumsAppearOnce(int []array, int num1[], int[] num2){
    	int flag = 1;
    	int temp = array[0];
    	for(int i = 1; i < array.length; i++)
    		temp = array[i]^temp;
    	while((flag&temp) == 0)
    		flag = flag * 2;
    	for(int i = 0; i < array.length; ++i){
    		if((flag & array[i]) == 0)
    			num2[0] ^= array[i];
    		else
    			continue;
    	}
    	num1[0] = temp^num2[0];
    }
}

代码效果图如图所示:

思路二:   可以采用哈希表的思想来完成该题:具体来说:直接将里面的每个数字映射到字典里,然后作为索引,出现次数作为值,最后取出值为一的索引值。具体我们用python将其实现:

class Solution:
    def FindNumsAppearOnce(self, array):
        count = {}      
        for i in array:      
            if i not in count:
                count[i] = 1
            else:
                count[i] += 1      
        ls = []
        for i in array:   
            if count[i] == 1:
                ls.append(i)
        return ls

代码效果图如图所示:

思路三:   通过遍历把统计的数字次数存入python内置的字典dict,然后再搜寻出现一次的数字,具体用Python实现如下:

class Solution:
	def FindNumsAppearOnce(self, array):
		tagdict = {}
		for i in array:
			if i in tagdict:
				tagdict[i] += 1
			else: 
				tagdict[i] = 1
		taglist = []
		for j in tagdict:
			if tagdict[j] == 1:
				taglist.append(j)
		return taglist

代码效果图如图所示:

思路四:   通过使用python的count计数函数,具体用python实现如下:

class Solution:
	def FindNumsAppearOnce(self, array):
		taglist = []
		for i in array:
			if array.count(i) == 1 and i not in taglist:
				taglist.append(i)
		return taglist	

代码效果图如图所示:

总结

  本道题通过数组来考察我们对综合知识的应用,在本题中我么用了四中方法来解决此问题。刚开始想到的问题就是对数组进行排序,然后将计数为1的将其输出,但是过于复杂,就没有实现。我们首先用到了异或和左移运算来解决此题,其实所示通过哈希表来解出该题,接着是用到了python中的字典,然后将为1的进行输出,最后就是用到了python中的count函数。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1] 山鬼谣弋痕夕 [2] 杨二K [3] jiayk2016