我尝试了这个问题。我没有得到正确的解决方案。请帮助。
问题:返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前。除此之外,数字可以是任何顺序。您可以修改并返回给定的数组,也可以创建一个新数组。
evenOdd([1, 0, 1, 0, 0, 1, 1]) → [0, 0, 0, 1, 1, 1, 1] evenOdd([3, 3, 2]) → [2, 3, 3] evenOdd([2, 2, 2]) → [2, 2, 2]
public int[] evenOdd(int[] nums) {
int l = nums.length;
if(l<2)
return nums;
int j=l-1;
for(int i=0;i<l;i++)
{
if(nums[i]%2==1)
{
while(j>i && nums[j]%2!=0) {
j--;
}
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
j--;
}
}
return nums;
}
答案 0 :(得分:2)
你真的非常接近。如果你只是包装你拥有的代码:
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
j--;
在if
中if (j > i)
您的代码确实有效。
答案 1 :(得分:2)
由于数组的顺序无关紧要,只需要一个循环,你可以尝试下面的函数,
var TodoInput = React.createClass({
getInitialState() {
return {
userInput: ''
};
},
handleChange(event) {
this.setState({
userInput: event.target.value
});
},
handleSubmit(event) {
event.preventDefault();
this.props.addItem(this.state.userInput);
this.setState({
userInput: ''
});
},
render() {
return (
<form onSubmit={this.handleSubmit}>
<input type="text"
onChange={this.handleChange}
value={this.state.userInput} />
<input type="submit" />
</form>
);
}
});
var Todo_list = React.createClass({
getInitialState() {
return {
items: []
};
},
addItem(item) {
this.setState({
items: this.state.items.concat(item)
});
},
render() {
const renderTodos = this.state.items.map((item, index) => {
return <li key={index}>{item}</li>;
});
return (
<div>
<TodoInput addItem={this.addItem} />
{renderTodos}
</div>
);
}
});
ReactDOM.render(
<Todo_list />,
document.getElementById('container')
);
答案 2 :(得分:1)
不确定这是否是&#34;作弊&#34;,但你可以创建2个数组,1代表保持平均数,1代表保持赔率。在循环中,您可以将每个值的所有数字复制到偶数或奇数数组,然后在循环之后,将数组连接/合并到一个新数组中并返回新数组。
答案 3 :(得分:1)
如果性能不太重要,您可以使用流:
static int[] evenOdd(int[] nums) {
return Arrays.stream(nums)
.boxed()
.sorted(Comparator.comparingInt(i -> i % 2))
.mapToInt(i -> i)
.toArray();
}
不幸的是,IntStream
没有sorted
方法需要Comparator
(只有parameterless method
,这就是为什么你必须装箱和取消装箱使用Stream.sorted(Comparator)
。
答案 4 :(得分:1)
以下代码需要O(N)
时间和O(1)
空间来完成您的任务。我为Python
代码道歉。
arr = list(map(int, raw_input().split()))
i = 0
j = len(arr) - 1
while i<j:
if arr[i]%2 != 0 and arr[j]%2 == 0:
t = arr[i]
arr[i] = arr[j]
arr[j] = t
i = i + 1
j = j -1
elif arr[i]%2 == 0 and arr[j]%2 == 0:
i = i + 1
elif arr[i]%2 == 0 and arr[j]%2 != 0:
j = j - 1
else:
j = j - 1
print arr
解释:代码逻辑非常自我解释。我们有两个计数器,i
从左端开始,j
从右端开始。如果左计数器指向even
,那么我们只是增加它,因为它在正确的位置。 [记住你想把平均值转移到左边。所以这甚至已经在数组的左侧。所以我们只增加i
]。请查看代码逻辑,找出基于偶数或奇数元素的当前指针所采取的操作。
例如:
如果我们发现i
指向odd
而j
指向`偶数,那么我们交换并移动两个指针。这是可以理解的,我希望
上述解决方案就位,需要O(1)空间和O(N)时间...希望这有帮助!!