2013-01-21 29 views
1

我有一个我无法解决的面试问题。将前半部分的所有偶数移到整数阵列中的后半部分

用Java编程语言编写的方法(不是程序),它将把前半部分的所有偶数和奇数编号移动到整数数组中的后半部分。

E.g.输入= {3,8,12,5,9,21,6,10};输出= {12,8,6,10,3,5,9,21}。

该方法应该将整数数组作为参数,并将项目移动到同一个数组中(不要创建另一个数组)。这些数字可能与原始数组的顺序不同。这是算法测试,所以尽量给出尽可能高效的算法(可能是线性O(n)算法)。避免使用内置的函数/ API。 *

也有一些基本的介绍,什么是数据结构效率

回答

6

(来自@马努 - fatto的建议很多的帮助),我相信这会做到这一点:

private static int[] OddSort(int[] items) 
{ 
    int oddPos, nextEvenPos; 
    for (nextEvenPos = 0; 
     nextEvenPos < items.Length && items[nextEvenPos] % 2 == 0; 
     nextEvenPos++) { } 
    // nextEvenPos is now positioned at the first odd number in the array, 
    // i.e. it is the next place an even number will be placed 

    // We already know that items[nextEvenPos] is odd (from the condition of the 
    // first loop), so we'll start looking for even numbers at nextEvenPos + 1 
    for (oddPos = nextEvenPos + 1; oddPos < items.Length; oddPos++) 
    { 
     // If we find an even number 
     if (items[oddPos] % 2 == 0) 
     { 
      // Swap the values 
      int temp = items[nextEvenPos]; 
      items[nextEvenPos] = items[oddPos]; 
      items[oddPos] = temp; 
      // And increment the location for the next even number 
      nextEvenPos++; 
     } 
    } 

    return items; 
} 

该算法遍历该列表恰好1次(检查每个元素恰好一次) ,所以效率是O(n)。

+0

''}''后''''可以最小化。 –

+2

@tintinmj当然可以,但不会推荐它。太容易让人认为';'是一个错字或不必要的,删除它,并搞砸了整个算法。 '{}'清楚地表明循环有一个空的体。 – JLRishe

+0

够公平的。好点子! –

10

保持两个指标:一个第一奇数和一个到最后一个偶数。交换这些数字并更新索引。

0

难道是你被要求实现一个非常基本的BubbleSort版本,其中e = arr [i],= e%2 == 1? 1:-1? 问候 莱昂

+0

排序会做,但他将不得不在一个单一的方法和正确。最重要的是,冒泡排序离O(n)很远。 – wilx

1
public static void sorted(int [] integer) { 

int i, j , temp; 

for (i = 0; i < integer.length; i++) { 

    if (integer[i] % 2 == 0) { 
     for (j = i; j < integer.length; j++) { 
       if (integer[j] % 2 == 1) { 
        temp = y[i]; 
        y[i] = y[j]; 
        y[j] = temp; 
       } 
      } 
     } 
     System.out.println(integer[i]); 
} 

public static void main(String args[]) { 

     sorted(new int[]{1, 2,7, 9, 4}); 



} 

} 

答案是1,7,9,2,4。

3

//用于循环为此在一个

public static void evenodd(int[] integer) { 

    int i = 0, temp = 0; 
    int j = integer.length - 1; 

    while (j >= i) { 
     // swap if found odd even combo at i and j 
     if (integer[i] % 2 != 0 && integer[j] % 2 == 0) { 
      temp = integer[i]; 
      integer[i] = integer[j]; 
      integer[j] = temp; 
      i++; 
      j--; 

     } else { 
      if (integer[i] % 2 == 0) { 
       i++; 
      } 
      if (integer[j] % 2 == 1) { 
       j--; 
      } 

     } 

    } 
} 
0
class Demo 
{ 
public void sortArray(int[] a) 
{ 
int len=a.length; 
int j=len-1; 
for(int i=0;i<len/2+1;i++) 
{ 
if(a[i]%2!=0) 
{ 
while(a[j]%2!=0 && j>(len/2)-1) 
j--; 
if(j<=(len/2)-1) 
break; 
a[i]=a[i]+a[j]; 
a[j]=a[i]-a[j]; 
a[i]=a[i]-a[j]; 
} 
} 
for(int i=0;i<len;i++) 
System.out.println(a[i]); 
} 

public static void main(String s[]) 
{ 
int a[]=new int[10]; 
System.out.println("Enter 10 numbers"); 
java.util.Scanner sc=new java.util.Scanner(System.in); 
for(int i=0;i<10;i++) 
{ 
a[i]=sc.nextInt(); 
} 
new Demo().sortArray(a); 
} 
} 
2

@JLRishe,

您的算法不会维护顺序。举一个简单的例子,说{1,5,2},你将把数组改为{2,5,1}。我无法评论您的帖子,因为我是一名新用户,缺乏声誉。

0
private static void rearrange(int[] a) { 
    int i,j,temp; 
    for(i = 0, j = a.length - 1; i < j ;i++,j--) { 
     while(a[i]%2 == 0 && i != a.length - 1) { 
      i++; 
     } 
     while(a[j]%2 == 1 && j != 0) { 
      j--; 
     } 
     if(i>j) 
      break; 
     else { 
      temp = a[i]; 
      a[i] = a[j]; 
      a[j] = temp; 
     } 
    }  
} 
0
public void sortEvenOddIntegerArray(int[] intArray){ 
    boolean loopRequired = false; 
    do{ 
     loopRequired = false; 
     for(int i = 0;i<intArray.length-1;i++){ 

      if(intArray[i] % 2 != 0 && intArray[i+1] % 2 == 0){ 

       int temp = intArray[i]; 
       intArray[i] = intArray[i+1]; 
       intArray[i+1] = temp; 
       loopRequired = true; 
      } 
     } 
    }while(loopRequired); 
} 
0

您可以通过移动奇品到数组的结尾,当你发现它们一个循环做到这一点。

static void EvensToLeft(int[] items) { 
    int end = items.length; 
    for (int i = 0; i < end; i++) { 
     if (items[i] % 2) { 
      int t = items[i]; 
      items[i--] = items[--end]; 
      items[end] = t; 
     } 
    } 
} 

给定输入数组长度n的内循环执行恰好n次,并计算每个数组元素的奇偶一次。

0

使用两个计数器i = 0和j = a.length-1并保持交换错误位置的偶数和奇数元素。

public int[] evenOddSort(int[] a) { 
     int i = 0; 
     int j = a.length - 1; 
     int temp; 
     while (i < j) { 
      if (a[i] % 2 == 0) { 
       i++; 
      } else if (a[j] % 2 != 0) { 
       j--; 
      } else { 
       temp = a[i]; 
       a[i] = a[j]; 
       a[j] = temp; 
       i++; 
       j--; 
      } 
     } 
     return a; 
    } 
0

公共类SeperatOddAndEvenInList {

public static int[] seperatOddAndEvnNos(int[] listOfNumbers) { 
    int oddNumPointer = 0; 
    int evenNumPointer = listOfNumbers.length - 1; 
    while(oddNumPointer <= evenNumPointer) {     
      if(listOfNumbers[oddNumPointer] % 2 == 0) { //even number, swap to front of last known even number 
       int temp; 
       temp = listOfNumbers[oddNumPointer]; 
       listOfNumbers[oddNumPointer] = listOfNumbers[evenNumPointer]; 
       listOfNumbers[evenNumPointer] = temp; 
       evenNumPointer--; 
      } 
      else { //odd number, go ahead... capture next element 
       oddNumPointer++; 
      } 


    } 
    return listOfNumbers; 
} 


public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int []arr = {3, 8, 12, 5, 9, 21, 6, 10}; 
    int[] seperatedArray = seperatOddAndEvnNos(arr); 
    for (int i : seperatedArray) { 
     System.out.println(i); 
    } 

} 

}

0

效率是O(log n)的。

public class TestProg { 
public static void main(String[] args) { 
    int[] input = { 32, 54, 35, 18, 23, 17, 2 }; 
    int front = 0; 
    int mid = input.length - 1; 
    for (int start = 0; start < input.length; start++) { 
    //if current element is odd 
     if (start < mid && input[start] % 2 == 1) { 
    //swapping element is also odd? 
      if (input[mid] % 2 == 1) { 
       mid--; 
       start--; 
      } 
    //swapping element is not odd then swap 
    else { 
       int tmp = input[mid]; 
       input[mid] = input[start]; 
       input[start] = tmp; 
       mid--; 
      } 
     } 

    } 
    for (int x : input) 
     System.out.print(x + " "); 
} 

}

0

公共类ArraysSortEvensFirst {

public static void main(String[] args) { 
    int[] arr = generateTestData(); 
    System.out.println(Arrays.toString(arr)); 

    ArraysSortEvensFirst test = new ArraysSortEvensFirst(); 
    test.sortEvensFirst(arr); 

} 

private static int[] generateTestData() { 
    int[] arr = {1,3,5,6,9,2,4,5,7}; 
    return arr; 
} 

public int[] sortEvensFirst(int[] arr) { 
    int end = arr.length; 

    int last = arr.length-1; 
    for(int i=0; i < arr.length; i++) { 
     // find odd elements, then move to even slots 
     if(arr[i]%2 > 0) { 
      int k = findEven(last, arr); 
      if(k > i) swap(arr, i, k); 
      last = k; 
     } 
    } 

    System.out.println(Arrays.toString(arr)); 
    return arr; 
} 

public int findEven(int last, int[] arr) { 
    for(int k = last; k > 0; k--) { 
     if(arr[k]%2 == 0) { 
      return k; 
     } 
    } 
    return -1; // not found; 
} 

public void swap(int[] arr, int x, int y) { 
    int temp = arr[x]; 
    arr[x] = arr[y]; 
    arr[y] = temp; 
} 

}

输出: [1,3,5,6,9,2,4,5,7] [4,2,6,5,9,3,1,5,7]

相关问题