1

面接の質問がありましたが、解決できませんでした。

Javaプログラミング言語でメソッド(プログラムではない)を記述します。このメソッドは、整数配列で前半のすべての偶数と後半に奇数を移動します。

例:入力= {3,8,12,5,9,21,6,10}; 出力={12,8,6,10,3,5,9,21}。

このメソッドは、整数配列をパラメーターとして受け取り、同じ配列内の項目を移動する必要があります(別の配列を作成しないでください)。番号は、元の配列とは異なる順序である可能性があります。これはアルゴリズムテストなので、できるだけ効率的なアルゴリズムを提供するようにしてください(おそらく線形O(n)アルゴリズム)。組み込み関数/APIの使用は避けてください。*

また、データ構造の効率とは何かについての基本的な紹介

4

14 に答える 14

10

2つのインデックスを保持します。1つは最初の奇数、もう1つは最後の偶数です。そのような番号を交換し、インデックスを更新します。

于 2013-01-21T15:11:17.507 に答える
6

(@ manu-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回トラバースする(各要素を正確に1回検査する)ため、効率はO(n)です。

于 2013-01-21T15:40:08.793 に答える
4

//これを1つのforループで実行するには

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

        }

    }
} 
于 2013-10-22T10:25:11.463 に答える
2

@ JLRishe、

あなたのアルゴリズムは順序を維持していません。簡単な例として、たとえば{1,5,2}の場合、配列を{2,5,1}に変更します。私は新しいユーザーであり、評判がないため、あなたの投稿の下にコメントすることはできませんでした。

于 2014-06-03T07:07:10.353 に答える
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です。

于 2013-07-05T03:47:29.273 に答える
0

要素eのソート値(e = arr [i]、= e%2 == 1)の非常に基本的なバージョンのBubbleSortを実装するように求められた可能性がありますか?1:-1?よろしくレオン

于 2013-01-21T15:14:32.273 に答える
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);
}
}
于 2013-10-22T11:32:00.217 に答える
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;
        }
    }       
}
于 2014-08-07T02:45:13.067 に答える
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);
}
于 2014-12-10T21:27:55.053 に答える
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回実行され、各配列要素のパリティを正確に1回計算します。

于 2015-03-23T04:44:48.493 に答える
0

2つのカウンター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;
    }
于 2016-01-18T03:52:53.583 に答える
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);
    }

}

}

于 2016-05-15T00:13:41.123 に答える
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 + " ");
}

}

于 2016-11-21T12:23:04.393 に答える
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]

于 2016-12-14T07:36:12.300 に答える