给定一个正数和负数(没有零)的数组,我必须以这样的方式排列它们:正数和负数应该连续排列。
正数和负数的数量可能不相等,也就是说,如果没有正数(或负数),那么所有剩余的负数(或正数)都会追加到数组的末尾。
顺序很重要,即如果输入数组是{2,-1,-3,-7,-8,9,5,-5,-7}
,那么输出数组应该是{2,-1,9,-3,5,-7,-8,-5,-7}
。代码在O(n)中完成,而不使用另一个数组。
这是我在java中的解决方案,我再次测试了几个案例并成功了。但是,我不确定这是否在O(n)时间内运行。基本上,我先计算正数和负数的数量。然后我有两个索引i=0
和j=1
。j
总是领先i
一步。从那里我继续检查i
中的数字是否为正,j
是否为负,如果不是,i
将遍历数组,直到我找到正确位置的下一个正/负并将其移动到正确位置。
任何建议都将不胜感激。谢谢
//array of negative and positive, arrange them so that positive number follow by negative
// if no pos or neg left, the rest append to the array.
//should be O(n) no additional array
public static void alter(int[] a) {
int pos = 0;
int neg = 0;
int index = 0;
while (c < a.length) {
if (a[index] > 0) {
pos++;
} else neg++;
index++;
}
int i = 0;
int j = 1;
int temp = 0;
//run until no more positive number or negative number
while (pos > 0 && neg > 0) {
//
if (a[i] > 0) {
pos--;
if (a[j] < 0) {
i += 2;
j += 2;
neg--;
} else // a[j] > 0
{
while (a[j] > 0) {
j++;
}
//a[j] < 0
neg--;
//move that number to the appropriate place
while (j > i) {
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
j--;
} // end while
i += 2;
j += 2;
}
} else // a[i] < 0
{
while (a[i] < 0) {
i++;
}
//a[i] > 0
//move that number to the appropriate place
while (i > (j - 1)) {
temp = a[i];
a[i] = a[i - 1];
a[i - 1] = temp;
i--;
}
} //end else
}
}
PFB我的代码。如果我们将使用Stack,那么它将使我们的问题更容易。
public class AlternatePosNeg {
public static void main(String[] args) {
int arr[] = { 2, -1, -3, -7, -8, 9, 5, -5, -7 };
Stack<Integer> pos = new Stack<>();
Stack<Integer> neg = new Stack<>();
int i;
for (i = 0; i < arr.length; i++) {
if (arr[i] > 0) {
pos.push(arr[i]);
} else {
neg.push(arr[i]);
}
}
int tempArr[] = new int[arr.length];
i = 0;
int sizePos = pos.size();
int sizeNeg = neg.size();
while (i < tempArr.length) {
if (sizePos > sizeNeg) {
if (pos.size() > 0) {
tempArr[i] = pos.pop();
}
if (neg.size() > 0) {
tempArr[i + 1] = neg.pop();
i++;
}
} else {
if (neg.size() > 0) {
tempArr[i] = neg.pop();
}
if (pos.size() > 0) {
tempArr[i + 1] = pos.pop();
i++;
}
}
i++;
}
for (int no : tempArr) {
System.out.print(no + " ");
}
}
}
是的,它可以在O(n)中完成。
假设c是当前位置。a[c]是正数。
1)从c向数组末尾递增i,直到i指向第一个错误的数字(与前一个符号相同的数字,在本例中为正)。
2) 设置j:=i
;
3)在数组末尾增加j,直到j指向带有通号的数字(在本例中为负)。
4)将[i]与[j]
交换。
5)设置c:=j
;
6)设置j:=c 1
;
在每一步中,你总是增加i、j或c,而不是减少。变量i的增量不能超过n倍。与j和c相同。
所以最大增量是3n~O(n)。
但是,我不确定这是否在O(n)
时间内运行
我不认为它在O(n)
中运行。当您必须“找到下一个正确的元素并将其移动到正确的位置”时,您需要
如果您需要遵守在不使用第三个数组的情况下必须遵守排序的要求,那么还不确定如何在O(n)
中运行它。
你会得到一个由n个整数组成的数组,包括负整数和正整数。您需要将它们划分为两个不同的数组,而不直接将任何元素与0、1、-1或任何其他固定值进行比较。将0视为正数。如果arr[0]是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然。注意:如果数组只包含正数,那么在第一行打印正数,在第二行打印“数组没有负数”。如果数组只包含负数,则在第一行打印负数,在第二
问题内容: 有没有一种简单的方法可以将数组中的所有负值都替换为0? 我对如何使用NumPy数组有一个完整的了解。 例如 我要回去 给出: 这就是我遇到的问题-如何使用此数组修改原始数组。 问题答案: 你在那儿 尝试:
问题内容: 在我正在处理的作业集中,我遇到了以下问题,我在使用Python-3函数时很难回答: “编写一个功能Alternate:int list-> int,它接受一个数字列表,并将它们加上交替的符号。例如,alternate [1,2,3,4] = 1-2 + 3-4 = -2。” 完全公开,该问题是考虑到Standard ML编写的,但我一直在尝试学习Python并遇到了这个问题。我在想它涉
问题内容: 我有一个Java方法,其中对一组数字求和。但是,我希望将任何负数都视为正数。因此(1)+(2)+(1)+(-1)应该等于5。 我敢肯定有很简单的方法可以做到-我只是不知道怎么做。 问题答案: 只需调用Math.abs即可。例如: 将设置为。
我必须制作一个程序,允许用户输入整数,直到按下“0”。程序必须打印:1)输入数字的总数2)正数3)正数的平均数4)负数5)负数的总和 到目前为止,我所能做的就是“输入直到按下‘0’”,并找到输入的数字的数量,这对我和我的编程技能来说是非常重要的。我很难找出这个数字是正数还是负数。也许我没有正确地比较他们,所以如果我能得到一些高级人员的帮助,我会很高兴。 这是我到目前为止的代码:
如果我有一个NxN numpy数组,如果任何位置都有一个负数,有没有一个简单快捷的方法可以用0代替这个数字?类似于