创建一个从1到10的随机数字数组。然后,将所有 7 移到前面 的数组。其他数字的顺序并不重要,只要所有数字都遵循幸运 7 组即可。查看插入排序和选择排序的代码可能对此分配非常有帮助。Arrays.toString(( 也将很有用。 例如,如果您得到列表:: 4 5 6 7 1 2 3 7 列表可以变成 - 所有 7 都必须是第一个 :: 7 7 6 4 1 2 3 5
我的代码:
public class NumberShifter
{
public int[] go(int[] arrayToBeShifted, int index)
{
int originalArray[] = new int[index];
int valueBeingMoved = originalArray[index];
for (int i = index; i > 0; i--)
{
arrayToBeShifted[i] = arrayToBeShifted[i-1];
}
arrayToBeShifted[0] = valueBeingMoved;
return arrayToBeShifted;
}
}
跑步者:
class Main
{
public static void main(String[] args)
{
int random[] = new int[10];
for(int i=0; i<random.length; i++)
{
random[i] = (int)(Math.random()*6)+1;
}
NumberShifter rt = new NumberShifter();
System.out.println(rt.go(random,7));
System.out.println(rt.go(random,7));
System.out.println(rt.go(random,7));
System.out.println(rt.go(random,7));
}
}
这个程序给了我错误 请任何人告诉我,我使用正确的方法来解决这个问题。如果我对此问题使用了错误的方法,请使用正确的方法解决此问题。
这是我解决问题的方式,我为代码制作了两个单独的类 runner 和 main。
我的代码:
public class NumberShifter
{
public int[] go(int[] arrayToBeShifted, int index)
{
for (int i = 0, e = 0; i < arrayToBeShifted.length; i++)
{
if (arrayToBeShifted[i] == 7)
{
arrayToBeShifted[i] = arrayToBeShifted[e];
arrayToBeShifted[e] = 7;
e++;
}
}
return arrayToBeShifted;
}
}
跑步者:
class Runner
{
public static void main(String[] args)
{
NumberShifter rt = new NumberShifter();
//demo to see if code works
System.out.println(java.util.Arrays.toString(rt.go(new int[]{1, 10, 9, 2, 8, 2, 5, 6, 10, 7, 9, 8, 6, 7, 2, 7, 6, 10, 5, 3},7)));
//random arrays according to question
int random[] = new int[20];
for(int i=0; i<random.length; i++)
{
random[i] = (int)(Math.random()*10)+1;
}
System.out.println(java.util.Arrays.toString(rt.go(random,7)));
System.out.println(java.util.Arrays.toString(rt.go(random,7)));
System.out.println(java.util.Arrays.toString(rt.go(random,7)));
}
}
您的逻辑中存在多个不准确之处,我已经修复了代码,以下内容应该可以解决您的问题
public class NumberShifter{
public static void main(String[] args){
int[] array = {7,7,1,1,2,3,4,7,7,7,5,7};
for(int i=0;i<array.length;i++){
System.out.print(" "+array[i]);
}
shift7s(array);
System.out.println("n");
for(int i=0;i<array.length;i++){
System.out.print(" "+array[i]);
}
}
public static void shift7s(int[] array) {
int i = 0;
int j = array.length -1;
while(i < j){
i = getIndexOfNextNonSeven(array, i);
j = getIndexOfNextSeven(array, j);
if(i == array.length || j < 0) break;
if(i < j){
swap(array, i, j);
}
}
}
private static int getIndexOfNextNonSeven(int[] array, int currentIndex){
while(currentIndex < array.length &&
array[currentIndex] == 7 ){
currentIndex++;
}
return currentIndex;
}
private static int getIndexOfNextSeven(int[] array, int currentIndex){
while(currentIndex < array.length &&
array[currentIndex] != 7 ){
currentIndex--;
}
return currentIndex;
}
private static void swap(int[] array, int p1, int p2){
int temp = array[p1];
array[p1] = array[p2];
array[p2] = temp;
}
}
问题出在NumberShifter
:
int originalArray[] = new int[index];
int valueBeingMoved = originalArray[index];
您正在创建一个大小为[index]
的数组。假设index = 7
,因此它的索引值为 0, 1, 2...6 但是在下一行中,您将访问不存在的originalArray[index]
(originalArray[7](。 所以你得到了例外。
除此之外,您的代码还有其他问题。
我想建议这个非常简单的方法:
public class Main {
public static void main(String[] args) {
int random[] = {4, 7, 6, 5, 7, 8, 0, 7, 1, 7};
printArray(random);
move7sToFirst(random);
printArray(random);
}
public static void move7sToFirst(int[] random) {
for (int i = 0; i < random.length; i++) //traverse array to find 7s
if (random[i] == 7) //if 7 found
for (int j = 0; j < i; j++) //traverse from beginning to index before 7 to find non-7
if (random[j] != 7) //if non-7 found
swap(random, i, j); //swap 7 with non-7
}
public static void swap(int[] random, int index1, int index2) {
int temp = random[index1];
random[index1] = random[index2];
random[index2] = temp;
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println("");
}
}
输出:
4 7 6 5 7 8 0 7 1 7
7 7 7 7 4 6 5 8 0 1
当然,这是时间复杂度为 O(n^2( 的最简单方法。这可以通过记住下一次迭代的索引来改进,并且可以显着降低时间复杂度以将其改进为几乎 O(n(。