我需要生成16个字符的所有可能字符串。字符只能是“a”或“b”。我怎么做?据我所知,有2 ^ 16种可能性。
以下是我正在尝试使用的代码:
public class Query5 {
public static void main(String[] args){
//Query5
String s="";
String [] hardCoded = {"16","13","3","14","11","9","4","6","15","12","2","10","8","5","1","7"};
for (int i=0; i<2; i++)
{
if (i==0)
s=s.concat("a");
else if (i==1)
s=s.concat("b");
for (int c=0; c<2; c++)
{
if (c==0)
s=s.concat("a");
else if (c==1)
s=s.concat("b");
for (int d=0; d<2; d++)
{
if (d==0)
s=s.concat("a");
else if (d==1)
s=s.concat("b");
for (int e=0; e<2; e++)
{
if (e==0)
s=s.concat("a");
else if (e==1)
s=s.concat("b");
for (int f=0; f<2; f++)
{
if (f==0)
s=s.concat("a");
else if (f==1)
s=s.concat("b");
for (int g=0; g<2; g++)
{
if (g==0)
s=s.concat("a");
else if (g==1)
s=s.concat("b");
for (int h=0; h<2; h++)
{
if (h==0)
s=s.concat("a");
else if (h==1)
s=s.concat("b");
for (int j=0; j<2; j++)
{
if (j==0)
s=s.concat("a");
else if (j==1)
s=s.concat("b");
for (int k=0; k<2; k++)
{
if (k==0)
s=s.concat("a");
else if (k==1)
s=s.concat("b");
for (int l=0; l<2; l++)
{
if (l==0)
s=s.concat("a");
else if (l==1)
s=s.concat("b");
for (int m=0; m<2; m++)
{
if (m==0)
s=s.concat("a");
else if (m==1)
s=s.concat("b");
for (int z=0; z<2; z++)
{
if (z==0)
s=s.concat("a");
else if (z==1)
s=s.concat("b");
for (int o=0; o<2; o++)
{
if (o==0)
s=s.concat("a");
else if (o==1)
s=s.concat("b");
for (int p=0; p<2; p++)
{
if (p==0)
s=s.concat("a");
else if (p==1)
s=s.concat("b");
for (int q=0; q<2; q++)
{
if (q==0)
s=s.concat("a");
else if (q==1)
s=s.concat("b");
for (int r=0; r<2; r++)
{
if (r==0)
s=s.concat("a, ");
else if (r==1)
s=s.concat("b, ");
System.out.println(s);
System.out.println(" ");
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
这是一个比N嵌套循环更简单的方法。
以一串正确长度的字符串开头。从字符串的一端开始,比如说左边,然后遍历它。
当您找到'b'时,请将其更改为'a'。
当您找到'a'时,将其更改为'b',打印字符串并返回字符串的开头。
当你到达字符串的末尾(没有找到'a')时,退出。
答案 1 :(得分:0)
我不知道您正在使用哪种编程语言,因此这里有一个脚本示例,您可以将其转换为所需的语言。 Objective-c有一个字符串方法,用于将字符串中的字符替换为另一个字符串,您的语言可能需要一个自定义方法,只需一个简单的循环。
编辑:您使用的是Java,您可以使用:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29
用b的
替换0的abd 1还使用Java中的Integer.toBinaryString(i)
将int转换为二进制字符串
本着@Damien_The_Unbeliever的评论精神。
array strings = [];
int i = 0;
while (i < 2^16) {
string s Integer.toBinaryString(i)
s = [s replaceOccourancesOf "0" with "a"];
s = [s replaceOccourancesOf "1" with "b"];
while (s.length < 16) {
s = s + "a";
}
strings = [strings, s];
i++;
}
^注意,这不是可执行的Java代码..它只是虚拟脚本。
我没有使用Java编程...我编写了Obj-c程序并制作了这个脚本并且编译得很好并执行了所有可能的值:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSMutableArray *strings = [[NSMutableArray alloc] init];
int i = 0;
while (i < (int)pow(2,16)) {
NSString *s = binaryStringFromInteger(i);
s = [s stringByReplacingOccurrencesOfString:@"0" withString:@"a"];
s = [s stringByReplacingOccurrencesOfString:@"1" withString:@"b"];
while (s.length < 16) {
s = [NSString stringWithFormat:@"%@a", s];
}
[strings addObject:s];
i++;
}
NSLog(@"%@", strings);
}
NSString * binaryStringFromInteger( int number ) {
NSMutableString * string = [[NSMutableString alloc] init];
int spacing = pow( 2, 2 );
int width = ( sizeof( number ) ) * spacing;
int binaryDigit = 0;
int integer = number;
while( binaryDigit < width )
{
binaryDigit++;
[string insertString:( (integer & 1) ? @"1" : @"0" )atIndex:0];
if( binaryDigit % spacing == 0 && binaryDigit != width )
{
[string insertString:@"" atIndex:0];
}
integer = integer >> 1;
}
return string;
}
从此处借用Obj-c二进制转换代码:https://stackoverflow.com/a/4393275/2057171