1. 程式人生 > 實用技巧 >[程式設計題] [程式設計題] 荷蘭棋問題

[程式設計題] [程式設計題] 荷蘭棋問題

[程式設計題] 荷蘭棋問題

題目資訊

​ 要求把陣列中的指定起始位置的元素按照比p小的放一邊,比p大的放一邊,等於p的放中間.返回相同值的索引值

思路

左邊用一個指標不斷框比p小的,右邊一個指標不斷框比p大的,然後中間的值不動。

注意

右邊的值交換過來的話,是需要重新對這個值進行一次判斷的,而不能直接index++.

Java程式碼

package interviewcode;

import com.sun.xml.internal.ws.client.MonitorRootClient;

import java.util.Arrays;

/**
 * @author jiyongjia
 * @create 2020/8/8 - 21:02
 * @descp: 要求把陣列中的比p小的放一邊,比p大的放一邊,等於p的放中間.返回相同值的索引值
 */
public class P27_荷蘭國棋 {
    public static void main(String[] args) {
        int[] ints = {2, 3, 21, 21, 4, 2, 5, 3, 723, 223, 12, 63};
        System.out.println(Arrays.toString(ints));
        int[] test = test(ints, 0, ints.length - 1, 21);
        //打印出了相同值的索引第位置
        System.out.println(Arrays.toString(test));
        System.out.println(Arrays.toString(ints));
    }

    public static int[] test(int[] arr,int L,int R,int p){
        int l = L-1;
        int r = R+1;
        int cur = L;
        while (cur< r){
            if(arr[cur] < p){
                swap(arr,++l,cur++);
            }else if(arr[cur] > p){
                swap(arr,--r,cur);  //這裡先別變,再判斷一次這個值【注意】
            }else{
                cur++;
            }
        }
        return new int[]{l+1,r-1};
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

輸出:

以21為例