返回一个数组,该数组包含与给定数组完全相同的数字,但重新排列后,每个3后面紧跟一个4。不要移动3,但是其他每个数字都可以移动。数组包含相同数量的3和4,每个3后面都有一个数字,而不是3,并且数组中的3之前是3。这是link
下面是我的代码。
public int[] fix34(int[] nums) {
for(int k = 0; k<nums.length; k++)
{
if(nums[k] == 3)
{
int jay = nums[k+1];
for(int j = 0; j<nums.length; j++)
{
if(nums[j] == 4)
{
nums[k+1] = nums[j];
nums[j] = jay;
}
}
}
}
return nums;
我想这样做,以便找到数字3时,继续寻找4(可能在3之前或之后),然后将数字切换为4,紧随其后的是3。但是,由于它不适用于所有情况,我猜我的代码不能完全做到这一点。否则,这是逻辑错误吗?任何帮助将不胜感激! (我知道那里还有其他解决方案,但我想确切地了解我的问题所在。)
答案 0 :(得分:0)
每次找到j
时,您将在0
重新启动3
。相反,您需要跟踪您处理的最后一个4
的位置,并开始寻找它后面的下一个:
public int[] fix34(int[] nums) {
int last4 = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 3) {
while (nums[last4] != 4) {
++last4;
}
nums[last4] = nums[i + 1];
nums[i + 1] = 4;
++last4;
}
}
return nums;
}
答案 1 :(得分:0)
您的代码中存在逻辑错误。每次检查nums [k] == 3时,都会运行内部循环,该循环将3之后的元素与在数组中找到的 first 4交换。如果我能说明(尽管效果很差):
如果nums [k]!= 3,我们将继续循环,因为它没有任何作用。
您的示例数组= {1,3,2,5,3,4,4}
当k == 1时,则nums [k] == 3为真。
因此它将运行内部循环,并且数组将更改为:
由于第一个元素4位于索引5处,因此它交换了索引2处的2和索引5处的4
第一次执行内部循环后的数组:{1,3,4,5,3,2,4}
然后直到k == 4为止它什么都不做
当k == 4时,nums [k] == 3是正确的
因此它将运行内部循环,并且数组将更改为:
第二次执行内部循环后的结果数组:{1,3,2,5,3,4,4}
如您所见,它用索引5的前4个(索引2)交换了。但是前4个已经正确放置(通过第一次执行内部循环),并且不应移动。因此,您需要跟踪正确放置的最后一个元素4,并将内部循环的开始设置为在最后一个元素之后。让我知道这是否有意义。
就目前而言,您的程序正在执行此操作:找到第一个元素4,并将其放置在最后一个元素3之后(中间的一些元素被交换)。
答案 2 :(得分:0)
我保持您的逻辑并进行一些更改。
找到4并进行交换后,内部循环需要break
。
另外,在寻找4时,请绕过3之后的任何4。
public static int[] fix34(int[] nums) {
for(int k = 0; k < nums.length; k++) {
if(nums[k] == 3) {
int jay = nums[k+1];
if (jay != 4) {
for (int j = 1; j < nums.length; j++) {
if (nums[j] == 4 && nums[j - 1] != 3) {
nums[k + 1] = 4;
nums[j] = jay;
break;
}
}
}
}
}
return nums;
}
public static void main(String[] args) {
int[] array1 = {1, 3, 1, 4};
int[] array2 = {1, 3, 1, 4, 4, 3, 1};
int[] array3 = {3, 2, 2, 4};
System.out.println(Arrays.toString(array1) + "-->" + Arrays.toString(fix34(array1)));
System.out.println(Arrays.toString(array2) + "-->" + Arrays.toString(fix34(array2)));
System.out.println(Arrays.toString(array3) + "-->" + Arrays.toString(fix34(array3)));
}
将打印
[1, 3, 1, 4]-->[1, 3, 4, 1]
[1, 3, 1, 4, 4, 3, 1]-->[1, 3, 4, 1, 1, 3, 4]
[3, 2, 2, 4]-->[3, 4, 2, 2]
答案 3 :(得分:0)
您也可以在while循环中做到这一点,加油!
this.form = this.formBuilder.group({ ...
status: [
{
value: test.status
disabled: true,
}
],
description: [
test.description || null, [
Validators.maxLength(100),
]
],