问题描述
我想在不使用任何数组,StringBuilder
或电动工具(为您工作的软件包或方法)并且不使用Math.random()
的情况下改组字符串。
下面的代码有效,但是我不喜欢它,因为我不能使用字符串生成器或.append()
。有人可以帮我修复它吗?
public class loopPrr
{
static String shuffle(int a) {
String s = "BaaBooDaaDoo";
StringBuilder sb = new StringBuilder(a);
for (int i = 0; i < a; i++) {
int r = (int)(s.length() * Math.random());
sb.append(s.charAt(r));
}
return sb.toString();
}
}
解决方法
如果我做对了,您可以简单地使用String:
static String shuffle(int a) {
String s = "BaaBooDaaDoo";
String sb = "";
for (int i = 0; i < a; i++) {
int r = (int) (s.length() * Math.random());
sb += s.charAt(r);
}
return sb;
}
我建议更改“ sb”变量的名称,以免造成误解。
,可以通过将Fisher--Yates algorithm应用于输入字符串的字符数组来对字符串进行混洗。
该算法主要包括如下所示在随机索引处交换字符。
static String shuffle(String str) {
char[] arr = str.toCharArray();
for (int i = str.length() - 1; i > 0 ; i--) { // starting from the last character
int x = (int)(i * Math.random()); // next index is in range [0...i-1]
char t = arr[i];
arr[i] = arr[x];
arr[x] = t;
}
return new String(arr);
}
如果需要从预定义的字母表中生成长度为a
的随机字符串,则可以基于String的先前实现来实现以下方法,以确保如果{ {1}}:
a >= alphabet.length