[编程题] [编程题] 荷兰棋问题

时间:2020-08-08
本文章向大家介绍[编程题] [编程题] 荷兰棋问题,主要包括[编程题] [编程题] 荷兰棋问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

[编程题] 荷兰棋问题

题目信息

​ 要求把数组中的指定起始位置的元素按照比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为例

原文地址:https://www.cnblogs.com/jiyongjia/p/13460636.html