LeetCode-75. Sort Colors

题目描述

给定一个由n个元素的数组,元素仅包含0,1,2三种形式,求数组排序的结果。不允许使用Arrays.sort()函数。

解题思路

  1. 借鉴快排的思想,利用双指针从数组的左右两路扫描数组。满足left小于right,则开启总循环。如果右指针遇到2,则继续扫描right–;否则,停止扫描。如果左指针遇到2,则停止扫描,与右指针指向的元素做交换;如果左指针遇到1,将该位置添加到列表中,将继续扫描left++;如果左指针遇到0,判断列表是否为空(其实就是判断当前这个0的前面有没有1),为空继续扫描left++,反之两元素交换,继续扫描但是不执行left++(因为该位置为1,并且该位置后面有可能出现0,需要记录该位置,以备交换)。总循环结束后,需要判断临界点的情况,比如:输入1,0,0这种情况,总循环结束后,有可能right指向0,而且列表不为空,也就是说在该right位置之前有1存在,需要交换。
  2. 可以将总循环的条件设置成left小于等于right,来避免最后一步的处理。

代码

public class Solution {
    public void sortColors(int[] nums) {
        if(nums==null || nums.length==0)
            return;
        int left=0;
        int right=nums.length-1;
        LinkedList<Integer> temList=new LinkedList<Integer>();
        int tem=0;
        while(left<=right){
            while(right>=left && nums[right]==2){
                right--;
            }
            while(left<=right && nums[left]<2){
                if(nums[left]==1){
                    temList.add(left);
                    left++;
                }else{
                    if(temList.size()!=0){
                    //这里不执行left++,如果执行了left++,该位置(元素值为1)就无法添加到列表中
                        nums[left]=1;
                        nums[temList.get(0)]=0;
                        temList.remove(0);
                    }else
                        left++;
                }

            }
            if(left<right){
                    tem=nums[right];
                    nums[right]=nums[left];
                    nums[left]=tem;
           }/*else if(temList.size()>0 && nums[right]==0){
                nums[right]=nums[temList.get(0)];
                nums[temList.get(0)]=0;
                //这里是left<right条件下,最后一步的判断
           }*/
        }
    }
}
CentOS配置 OpenVPN 服务器,并限制特定客户端访问百度网站,你需要结合 OpenSSH 和 IPtables 来实现这个功能。以下是步骤: 1. **安装 OpenVPN**: 首先确保已经安装了 OpenVPN 服务,如果没有,可以使用 yum 安装: ```sh sudo yum install openvpn EasyRSA ``` 2. **生成证书和密钥对**: 使用 EasyRSA 工具创建 CA、服务器和客户端证书,假设你已经在 `easy-rsa` 目录下: ```sh cd /usr/share/easy-rsa source vars ./clean-all ./build-ca ./gendh 2048 ./genrsa 2048 > server.key ./req -nodes -newkey rsa:2048 -keyout server.crt -subj "/CN=server" -CAcreateserial ./pkitool client-configs/pki/ca.crt client.crt client.key ``` 3. **配置 OpenVPN**: 编辑 `/etc/openvpn/server.conf` 文件,添加以下内容以启用 IPTables 策略: ```conf # ...其他配置... block-outside-dns push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8;8.8.4.4" # 添加 Google DNS 作为备选 push "block-ipv4" push "route 0.0.0.0 0.0.0.0" # 这里设置允许访问的网络和阻止访问百度IP的规则 route 10.8.0.0 255.255.255.0 net_gateway block-list = {your_baidu_ip} ``` 将 `{your_baidu_ip}` 替换为你想禁止访问的具体百度 IP 地址。 4. **防火墙规则**: 创建一个新的 IPTables 规则以阻止访问百度: ```sh sudo iptables -A INPUT -d your_baidu_ip -j DROP sudo iptables -t nat -A PREROUTING -d your_baidu_ip -j REDIRECT --to-port 0 ``` 保存并应用更改: ```sh sudo service iptables save sudo systemctl restart iptables.service ``` 5. **启动和监控 OpenVPN**: ```sh sudo systemctl start openvpn@server sudo systemctl enable openvpn@server tail -f /var/log/openvpn.log ``` 现在,当尝试连接的客户端试图访问百度网站时,它们将被 OpenVPN 阻止,同时默认只会转发内部网络流量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值