打卡第四天:只出现一次的数字


题目描述

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?


一、思路

利用一个双重循环,把每一个数和数组里其他数比较,遇到相等的就终止内层循环(即这个数不符合要求,无需再比较),没有相等的则记录下来。


二、完整代码

class Solution {
    public int[] singleNumber(int[] nums) {
        int result[] = new int[2];  // 结果数组
		int t=0;
		for(int i=0;i<nums.length;i++){
			int j;
			for(j=0;j<nums.length;j++){
				if(i!=j && nums[i]==nums[j])
					break;
			}
			// 扫描了整个数组,nums[i]没有与该数组最后一个数以前的任一个数相等
			// 注意:这漏了一种情况,即nums[i]为最后一个数的情况
			if(j==nums.length && nums[i]!=nums[j-1]){
				result[t]=nums[i];
				t++;
			}
		}
		// 最后一个数为所求时的情况
        if(t<2)result[t]=nums[nums.length-1];
		return result;
    }
}

三、进阶

可以先将数组里的数排序,先比较前两个,如果第一个数和第二个数相等,则直接跳到第三个数继续往后比较;若第一个数和第二个数不相等,则第一个数为所求之一,再跳到第二个数继续往后比较。


其他的有时间再来更吧~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值