转载一个String数组Java
Reprint a String array Java
我有一个字符串数组
"Ben", "Jim", "Ken"
如何将上面的数组打印 3 次,如下所示:
"Ben", "Jim", "Ken"
"Jim", "Ben", "Ken"
"Ken", "Jim", "Ben"
我只希望初始数组中的每一项都显示为第一个元素。其他项目出现的顺序无关紧要。
更多示例
输入
"a","b","c","d"
输出
"a","b","c","d"
"b","a","c","d"
"c","b","a","d"
"d","a","c","d"
方法签名
public void printArray(String[] s){
}
public void printArray(String[] s){
for (int i = 0; i < s.length; i++) {
System.out.print("\"" + s[i] + "\",");
for (int j = 0; j < s.length; j++) {
if (j != i) {
System.out.print("\"" + s[j] + "\",");
}
}
System.out.println();
}
}
for(int i=0;i<s.length;i++){
for(int j=i;j<s.length+i;j++) {
System.out.print(s[j%(s.length)]);
}
System.out.println();
}
使用mod适合这个问题。你的第一个例子的打印值的索引是这样的;
0 1 2
1 2 0
2 0 1
所以如果你像下面这样写它们并取 mod 数组的长度(在本例中为 3),你将得到解决方案。
0 1 2
1 2 3
2 3 4
这听起来像是一道家庭作业题,所以虽然我觉得我不应该回答它,但我会给出一个简单的提示。您正在寻找一种算法,该算法将给出元素 "for loop index" 的所有排列(组合)而不是元素本身。所以如果你有三个元素 a、b、c,它们的索引是 0、1、2,我们所需要的只是一种生成 0、1、2 排列的方法,所以这会导致一个常见的数学问题,数学公式非常简单.
我不会直接给你代码,而是会尝试解释这个问题的 theory/mathematics。
我能想到的解决这个问题的两种最简单的方法是
- 循环遍历所有元素
- 选择一个元素并列出其余元素
第一种方法要求您遍历索引,然后遍历数组中的所有元素,并在必要时循环回到开头,在 return 到原始元素时终止。
第二种方法需要您遍历索引,打印原始元素,然后从头开始遍历数组,跳过原始元素。
如您所见,这两种方法都需要两次循环(因为您要遍历数组两次)
在伪代码中,第一种方法可以写成:
for (i = array_start; i < array_end; i++) {
print array_element[i]
for (j = i + 1; j != i; j++) {
if (j is_larger_than array_end) {
set j equal to array_start
}
print array_element[j]
}
}
在伪代码中,第二种方法可以写成:
for (i = array_start; i < array_end; i++) {
print array_element[i]
for (j = array_start; j < array_end; j++) {
if (j is_not_equal_to i) {
print array_element[j]
}
}
}
我有一个字符串数组
"Ben", "Jim", "Ken"
如何将上面的数组打印 3 次,如下所示:
"Ben", "Jim", "Ken"
"Jim", "Ben", "Ken"
"Ken", "Jim", "Ben"
我只希望初始数组中的每一项都显示为第一个元素。其他项目出现的顺序无关紧要。
更多示例
输入
"a","b","c","d"
输出
"a","b","c","d"
"b","a","c","d"
"c","b","a","d"
"d","a","c","d"
方法签名
public void printArray(String[] s){
}
public void printArray(String[] s){
for (int i = 0; i < s.length; i++) {
System.out.print("\"" + s[i] + "\",");
for (int j = 0; j < s.length; j++) {
if (j != i) {
System.out.print("\"" + s[j] + "\",");
}
}
System.out.println();
}
}
for(int i=0;i<s.length;i++){
for(int j=i;j<s.length+i;j++) {
System.out.print(s[j%(s.length)]);
}
System.out.println();
}
使用mod适合这个问题。你的第一个例子的打印值的索引是这样的;
0 1 2
1 2 0
2 0 1
所以如果你像下面这样写它们并取 mod 数组的长度(在本例中为 3),你将得到解决方案。
0 1 2
1 2 3
2 3 4
这听起来像是一道家庭作业题,所以虽然我觉得我不应该回答它,但我会给出一个简单的提示。您正在寻找一种算法,该算法将给出元素 "for loop index" 的所有排列(组合)而不是元素本身。所以如果你有三个元素 a、b、c,它们的索引是 0、1、2,我们所需要的只是一种生成 0、1、2 排列的方法,所以这会导致一个常见的数学问题,数学公式非常简单.
我不会直接给你代码,而是会尝试解释这个问题的 theory/mathematics。
我能想到的解决这个问题的两种最简单的方法是
- 循环遍历所有元素
- 选择一个元素并列出其余元素
第一种方法要求您遍历索引,然后遍历数组中的所有元素,并在必要时循环回到开头,在 return 到原始元素时终止。
第二种方法需要您遍历索引,打印原始元素,然后从头开始遍历数组,跳过原始元素。
如您所见,这两种方法都需要两次循环(因为您要遍历数组两次)
在伪代码中,第一种方法可以写成:
for (i = array_start; i < array_end; i++) {
print array_element[i]
for (j = i + 1; j != i; j++) {
if (j is_larger_than array_end) {
set j equal to array_start
}
print array_element[j]
}
}
在伪代码中,第二种方法可以写成:
for (i = array_start; i < array_end; i++) {
print array_element[i]
for (j = array_start; j < array_end; j++) {
if (j is_not_equal_to i) {
print array_element[j]
}
}
}