2012-09-29 75 views
2

我一直在努力工作,这一点:数组中的元素交换

说我有一个数组:

int[] n = {0, 0, -1, 1, 0, 1, 1, -1, 1}; 

我需要能够通过数组排序,如果有一个在它之前有一个非零的零,那么它们应该交换。

例如:0, 0, -1, 1, 0, 1, 1, -1, 1

将变为:0, 0, -1, 0, 1, 1, 1, -1, 1

我一直在尝试使用for环和if声明没有运气做到这一点。有小费吗?

+5

'“任何提示?”:是的 - 请[请告诉我们你试过的是什么](http://mattgemmell.com/2008/12/08/what-have-you-tried/)。我们还有什么可以猜测你可能做错了什么?我们还会如何知道您可能需要清除哪些误解? –

+4

太好了。这里来了勺子喂食器。为什么不先等到我们看到OP首先尝试了什么? –

+0

他们不完全是勺子喂养。我遇到的问题不是我问的问题的复制品,我只是需要类似的帮助,如果一个if语句和temp变量持有者对我解决我的实际问题有很大的帮助! 我明白为什么你有这种特殊的态度,但悬停。 感谢大家帮助,现在我只需要弄清楚为什么它会出现越界异常。 – Nicholas

回答

3

试试这个:

for (int i = 1 ; i < n.length ; i++) 
    if (n[i] == 0 && n[i - 1] != 0) { 
     int tmp = n[i - 1]; 
     n[i - 1] = n[i]; 
     n[i] = tmp; 
    } 

你是正确的思维,你会需要一个for环在其身体的if声明。我们在这里所做的是从元素1开始遍历数组。然后检查我们当前所在的元素是否为0上一个元素不是0:即if (n[i] == 0 && n[i - 1] != 0)。如果这个条件成立,我们交换这两个元素。

0

如果不使用位调换,则需要一个临时变量来交换两个对象。例如:

int[] n = {...}; 
int temp = n[3]; // swaps n[3] and n[4] 
n[3] = n[4]; 
n[4] = temp; 

你可以在你的循环内粘贴一些东西来完成你所描述的内容。

+1

致敬:我明白你为什么这样做。然而,我没有发布一个完整的解决方案,我只是发布了一个简单的例子,说明两个变量如何经常交换,并提出了如何使用类似技术的建议。 – jli

+0

即使发布完整的解决方案,只要结合一些解释,我都不会看到问题。阅读[this](http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated)(特别是评论)。 – arshajii

+0

我引用[Tim Post](http://stackoverflow.com/users/50049/tim-post):“如果你不想要一个完整的审查,完整和可测试的答案,堆栈溢出不是要问的地方。 “ – arshajii

2
for(int i=0; i < length; i++) 
{ 
    if(i > 0 && arr[i] == 0 && arr[i-1] != 0) 
    { 
     int temp = arr[i-1]; 
     arr[i-1] = arr[i]; 
     arr[i] = temp; 
    } 
} 

应该工作。

+2

投票的理由是很好的。 –

+4

为什么不在i = 1开始你的循环,因为你的if子句在检查中的i> 0? –

+0

的确,我可以做到这一点。但它不会使算法错误。 –