[程式設計題] [程式設計題] 荷蘭棋問題
阿新 • • 發佈:2020-08-09
[程式設計題] 荷蘭棋問題
題目資訊
要求把陣列中的指定起始位置的元素按照比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為例