所以我有个作业要做,它是这样的:
编写一个void premakni()方法,循环移动表中的元素,使最小的元素在表中排在第一位,但元素的顺序不变。当实现一个方法时,你不能创建和使用任何新的表,也不能使用任何额外的Java类(例如用于处理表或字符串)。
我已经尝试了多种解决方案,我不能得到它的窍门。以下是我的一些测试示例:测试:
int[] a={0,1,2,-1,-2};
int[] b=premakni(a);
System.out.println(izpisiTab(a));
System.out.println(izpisiTab(b));
结果:0 1 2 -1 -2 -2 0 1 2 -1
测试:
int[] a={8,5,6,2,1,-1,-100,425,84};
int[] b=premakni(a);
System.out.println(izpisiTab(a));
System.out.println(izpisiTab(b));
result:
8 5 6 2 1 -1 -100 425 84
-100 425 84 8 5 6 2 1 -1
“izpsiTab”是一个只打印数组的方法。有人能给予我一些建议,我应该如何做?
我现在的代码是这样的:
public static void premakni(int[] tabela) {
int minValueIndex = 0;
int minValue = tabela[0];
// Find the minimum element and its index in the array
for (int i = 1; i < tabela.length; i++) {
if (tabela[i] < minValue) {
minValue = tabela[i];
minValueIndex = i;
}
}
// Shift the elements to the left
for (int i = minValueIndex; i > 0; i--) {
tabela[i] = tabela[i - 1];
}
// Place the minimum element at the first position
tabela[0] = minValue;
}
但是我得到了错误,因为这是一个空函数,在测试中我有“int[] b=premakni(a);“我不能这样把任何东西放进B里。我的代码也改变了“a”数组,但它应该保持不变
3条答案
按热度按时间7eumitmz1#
最直接的方法是找到最小值及其位置,然后旋转,使值位于位置
0
。找到最小位置是在线性时间内完成的。长杆是旋转。对于单向旋转,将需要N
旋转,其中N
是lowest value
的position
。使用另一个数组可以加快这个过程,但由于这是不允许的,提供left
和right
旋转方法可以最大限度地减少所需的旋转。如果最小单元格超出中间,则向右旋转。否则,向左旋转。印刷品
左右旋转方法。可能有更好的方法来做到这一点,但提供两种不同的方法是最直接的。
按计数单元向右旋转
注意:因为你正在修改一个传递的数组,所以不需要返回它。我只是为了演示方便。
kfgdxczn2#
第一步:找出最小的元素,得到索引
第二步:使用该索引计算所需的旋转次数。
步骤3:如果最小的元素已经在第一个索引处,则
numberOfRotations
将是0
,因此不需要做任何事情,只需返回数组。第四步:数组向右旋转一次说明
1.备份数组中最右边的元素,即最后一个元素(
int temp = ar[ar.length-1];
)。如果向左旋转,则选择最左侧的元素,即第一个元素。1.从数组的最后一个索引开始for循环,并在第一个索引之前停止。(
for(int i=ar.length-1; i>0; i--)
)1.将当前索引中的元素替换为其后面的元素。(
ar[i] = ar[i-1];
)。所以你的数组[8, 5, 6, 2, 1, -1, -100, 425, 84]
在循环后将像这样转换[8, 8, 5, 6, 2, 1, -1, -100, 425]
1.用备份(
ar[0] = temp;
)替换第一个元素,得到旋转后的数组[84, 8, 5, 6, 2, 1, -1, -100, 425]
第五步:继续执行,直到
numberOfRotations
变为0。操作完成
pxiryf3j3#
用于旋转数组的代码不起作用。此代码遵循以下规则:* 不能创建和使用任何新表,也不能使用任何额外的Java类 *(除了用于打印的
System
和Arrays
)。查看代码注解。输出: