偶数数字在奇数之前使用数组且只有一个循环

时间:2016-10-04 11:49:20

标签: java sorting

我尝试了这个问题。我没有得到正确的解决方案。请帮助。

  

问题:返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前。除此之外,数字可以是任何顺序。您可以修改并返回给定的数组,也可以创建一个新数组。

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;
}

5 个答案:

答案 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指向oddj指向`偶数,那么我们交换并移动两个指针。这是可以理解的,我希望

上述解决方案就位,需要O(1)空间和O(N)时间...希望这有帮助!!