好记性不如铅笔头

java, 数据结构与算法, 编程

算法学习笔记:java排列和随机的实现

最近需要一个排列和随机的需求,就自己写了一个简单的。在这里备份下:

CONTENTS

排列:

static long idx = 1;
public static void printArrange(String arr[], Set<Integer> skip, String before)
{
	for (int i = 0; i < arr.length; i++)
	{
		if (skip.contains(i))
		{
			continue;
		}
		skip.add(i);
		printArrange(arr, skip, before + arr[i] + "->");
		skip.remove(i);
	}
	if (skip.size() == arr.length)
	{
		System.out.print("" + idx++ +"\t\t\t");
		System.out.println(before);
	}
}

调用方式: 

String arr2[] = new String[]{"A","B","C","D"};
printArrange(arr, new HashSet<Integer>(), "");

随机数:

public static void printRandom(String arr[], int times)
{
	Random random = new Random();
	int size = arr.length;
	//包含之前已经打印过的序列。
	Set<String> before = new HashSet<String>();
	
	for (int j = 0; j < times; j++)
	{
		int idx = 0;
		Set<Integer> skip = new HashSet<Integer>();
		//当前序列的key值,用来检测是否已经打印过。
		StringBuilder sb = new StringBuilder();
		//需要打印的序列
		StringBuilder str = new StringBuilder();
		
		for (int i = 0; i < size; i++)
		{
			do
			{
				idx = random.nextInt(size);
			} 
			while (skip.contains(idx));
			skip.add(idx);
			sb.append(idx);
			str.append(arr[idx] + "->");
		}
		
		if (!before.contains(sb.toString()))
		{
			System.out.println(str.toString());
			before.add(sb.toString());
		}
	}
}

 调用方式:

String arr[] = new String[]{"A","B","C","D"};
printRandom(arr, 100);

 备注:

1)代码的实现写得比较简单,只是一个简单的思路,后续可以根据特定需求进行修改。

发表评论

1 × 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据