力扣简136 只出现一次的数字
数组的排序 集合set 位运算异或
我只能暴力,题目要求线性复杂度我根本就想不到,最后还是用了平方,乌鱼子!

package leetcode01; //给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 //你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? public class Solution136 { public static int singleNumber(int[] nums) { for(int i=0;i<nums.length;i++) { int num = 0; for(int j=0;j<nums.length;j++) { if(nums[i]==nums[j]) { num++; } } if(num==1) { return nums[i]; } } return 0; } public static void main(String[] args) { // TODO Auto-generated method stub int[] nums= {1,2,3,2,1}; System.out.println(singleNumber(nums)); } }
题解1:排序

public static int singleNumber(int[] nums) { Arrays.sort(nums);//数组的排序!自动返回排序后的结果! for(int i=0;i<nums.length;i =i+2) { if(i+1>=nums.length) { return nums[i]; } if(nums[i]!=nums[i+1]) { return nums[i]; } } return 0; }
题解2:巧用集合set

//利用Set使用额外空间的线性复杂度实现 public static int singleNumber(int[] nums) { Set<Integer> numsSet=new HashSet<Integer>(); int sumArray=0; int sumSet=0; for(int i=0;i<nums.length;i++) { numsSet.add(nums[i]); sumArray=sumArray+nums[i]; } for(int i:numsSet) { sumSet=sumSet+i; } return sumSet*2-sumArray; }
题解三:异或

public static int singleNumber(int[] nums) { int res=0; for(int i:nums) { res=res^i; } return res; }

浙公网安备 33010602011771号