`
zhang_xzhi_xjtu
  • 浏览: 540346 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

生成不大于n的k个两两不同的自然数

阅读更多
需要一个函数得到该数组,输入为n,k。
没有仔细考虑得到了一个油漆匠算法。

private static int[] f(int n, int k) {
		boolean[] bits = new boolean[n + 1];
		Random r = new Random();
		// k次循环,设置那些数出现在结果里。
		for (int i = 0, stepRange = n + 1; i < k; i++, stepRange--) {
			// 设置第几个为空的位。从0开始。
			int step = r.nextInt(stepRange);

			for (int j = 0;; j++) {
				if (bits[j] == false && step == 0) {
					bits[j] = true;
					break;
				} else if (bits[j] == false) {
					step--;
				}
			}
		}

		int values[] = new int[k];

		for (int i = 0, index = 0; i < bits.length; i++) {
			if (bits[i]) {
				values[index++] = i;
			}
		}
		// 混乱函数
		shuffle(values);

		return values;
	}

忍不住鄙视一下自己。这个函数真是超烂。本来很简单的一个事情竟然被我搞得那么复杂。程序员还是应该思而后动的。
		int[] n_array = new int[n + 1];
		for (int i = 0; i < n_array.length; i++) {
			n_array[i] = i;
		}
		shuffle(n_array);
		int[] k_array = new int[k];
		System.arraycopy(n_array, 0, k_array, 0, k_array.length);

分享到:
评论

相关推荐

    容斥原理解N以下的素数个数

    3. 对于每个素数p ≤ √N,对于它的每个平方倍数q = p², p³, ..., (p^k) * p,其中p^k * p ≤ N,加回[N/q],即π(N) += [N/q]。 这个算法的时间复杂度为O(√N log log N),在实际应用中,对于10亿以下的N,可以...

    java编程练习题

    - **定义**:素数(Prime Number)是指只能被1和自身整除的大于1的自然数。 - **实现思路**: - 遍历101到200之间的每一个数。 - 对于每个数n,从2到√n进行遍历,检查是否有因子。 - 如果没有因子,则n为素数。 ...

    Java初级逻辑测试经典19题

    质数是指只能被1和自身整除的大于1的自然数。可以通过遍历每个数并检查它是否只能被1和自身整除来找到这些质数。 **实现思路:** 1. 对于每个数i (101 ),检查其是否有除了1和自身以外的因数。 2. 如果没有,则i是...

    华为面试180题(软件)

    - **问题**: 不使用开方运算,判断一个自然数是否为某个数的平方。 - **解法**: 通过累加奇数来判断,利用平方数的性质。 **20. 生成1到7的随机数** - **问题**: 已知生成1到5的随机数的函数,如何生成1到7的...

    微软、谷歌、百度等公司经典面试100题[第101-170题].pdf

    - **题目描述**:给定一个集合A和一个正整数K,用A中的元素组成一个大于K的最小正整数。 - **解决方案**:可以使用贪心算法,每次选择最大的可用数字加入结果中。 #### 百度三道面试题详解 **24. 字符串逆序** - ...

Global site tag (gtag.js) - Google Analytics