LeetCode.和为0的N个唯一整数(Java+做题反思)

给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。

  • 首先讲讲我的做题历程是怎样的: 我是一上来就用的暴力解法,想通过循环生成数组 [n/2] 前面的随机数,最后将剩下的部分=前面对称部分*(-1),不过要讨论n为奇数和偶数的情况,奇数的话,数组[n/2]可以直接设为0,其余两两对称;而偶数的,就刚好对称,只需要循环处理好就可以。
    循环也很重要:考虑循环到哪个位置!!!
  • 但是一直不对,后来考虑到,是因为随机数生成了好几个相同的数,于是进行去重。想的是用HashSet,生成随机数之后,将不在set里面的随机数,都加进来,但是没有考虑好已经存在的数,之后该怎么解决,其次这个循环的次数又该是多少呢
  • 但是但是!!重点来了,为什么我花了这么长时间没有写出来呢?我这还是二刷的题,反思:没有耐心!眼高手低,没有写在纸上好好琢磨。所以:做题一定要有耐心,万一就做出来呢?一定要扎扎实实的写呀

还是看代码吧

解法一

不太简洁高效的思路
随机数判重这里:循环遍历:如果set存在该数了,重新再生成一个数。结束的循环的情况:set不存在该元素。那么后面就可以加进set和list去。

public int[] sumZero(int n) {
    
    
	if (n == 1) {
    
    
		return new int[] {
    
     0 };
	}
	ArrayList<Integer> list = new ArrayList<>();
	HashSet<Integer> set = new HashSet<>();
	int[] find = new int[n];
	for (int i = 0; i < n / 2; i++) {
    
    
		int temp = new Random().nextInt(1000) + 1;
		while (set.contains(temp) || temp == 0) {
    
    
			temp = new Random().nextInt(1000) + 1;
		}
		set.add(temp);
		list.add(temp);
	}
	for (int i = 0; i < list.size(); i++) {
    
    
		find[i] = list.get(i);
	}
	if (n % 2 == 0) {
    
    
		for (int i = n - 1; i >= n / 2; i--) {
    
    
			find[i] = find[n - 1 - i] * -1;
		}
	} else {
    
    
		for (int i = n - 1; i > n / 2; i--) {
    
    
			find[i] = find[n - 1 - i] * -1;
		}
		find[n / 2] = 0;
	}
	return find;
}

更简单的方法,其实主要是思路!!!

解法二

设一个数组arr,循环,将(i+1)赋给arr数组 n/2 前面 的每个元素,然后再来一个循环,从最后一个开始,到n /2结束,将前面的元素*(-1),再赋给后面的元素。
其中arr[n/2]的情况:如果n为奇数,那么arr[ n/2]处于正中间的位置,循环的时候没有赋值,只是原来的0;如果n为偶数,因为刚好对称,所以前后互为相反数。

public int[] sumZero2(int n) {
    
    
	int[] arr = new int[n];
	for (int i = 0; i < n / 2; i++) {
    
    
		arr[i] = i + 1;
	}
	for (int i = n - 1; i >= n / 2; i--) {
    
    
		arr[i] = 0 - arr[n - 1 - i];
	}
	return arr;
	}

这样一想,觉得自己之前的思路太蠢了,呜呜呜,哭泣

解法三

可以将数组的前n - 1个全部附上值,最后一个元素为前面元素总和的相反数!!!!哇,好简单,我弱爆了,流下了不聪明的眼泪。

public int[] sumZero3(int n) {
    
    
	int[] arr = new int[n];
	int sum = 0;
	for (int i = 0; i < n - 1; i++) {
    
    
		arr[i] = i;
		sum += arr[i];
	}
	arr[n - 1] = 0 - sum;
	return arr;
}

end.要耐心!!要动笔!!要动脑!动脑!动脑!

猜你喜欢

转载自blog.csdn.net/weixin_44998686/article/details/108588221