使用SoftEther搭配VPS搭建VLAN环境(全网最详细!100%成功)
使用SoftEther搭配VPS搭建VLAN环境(全网最详细中文教程!100%成功)
提醒:阅读本文并按照步骤操作预计需要30分钟以上,请读者保持绝对的细心和耐心。
1. 背景介绍
动机:codemaster F1系列游戏的联机模式类似P2P,在分布式的节点环境下数据传输和同步异常缓慢,经常出现长时间的加载等候、发车灭灯延迟、圈数和名次计算错乱等影响游戏和比赛体验的状况,因此考虑自己架设私人VPN实现虚拟局域网游戏。
本文所述VPN遵循其英文全称Virtual Private Network的严格表述,旨在创建远程私人局域网环境以供游戏使用,未涉及任何非法用途。尝试用该方法连接境外VPS实现科学上网的朋友,若触犯法律则后果自负。(我看刑)
如果你按照本文严格操作,一定能够搭建一个性能令自己满意的虚拟局域网服务器。相关资源分散,收集和尝试不易,如果本文内容对你有一定帮助,可以通过打赏(二维码在页面底部)的方式支持作者。
2. 准备工作
一个可以用作vps的付费服务器。免费服务器亦可尝试,但不保证效果
可以是任意有固定公网IP的服务器
示例使用GCP香港实例(内地访问居然也很好用)、阿 ...
Leetcode 526. 优美的排列
法1: 回溯
代码:
1234567891011121314151617181920212223class Solution:    def countArrangement(self, n: int) -> int:        self.num = 0        mat = defaultdict(list)        for i in range(1, n + 1):            for j in range(1, n + 1):                if i % j == 0 or j % i == 0:                    mat[i].append(j)        def recur(k):            if k == n + 1:                self.num += 1                return                        for i in mat[k]:                if i not in v:                    ...
Leetcode 40. 组合总和 II
首先回顾一下39题,这次用Python写。39题区别就是可以重复访问同一位置的元素。
代码:
123456789101112131415def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:    def dfs(candidates, start, nums, path, res, target):        if target == 0:            res.append(path)            return        for i in range(start, nums):            if target - candidates[i] < 0: break            dfs(candidates, i, nums, path + [candidates[i]], res, target - candidates[i])    res = []    path = []    nums = len(candidat ...
Leetcode 611. 有效三角形的个数
排序数组枚举+双指针。
代码
1234567891011def triangleNumber(self, nums: List[int]) -> int:    n = len(nums)    res = 0    nums.sort()    for i in range(n):        j, k = i - 1, 0        while j > k:            while j > k and nums[j] + nums[k] <= nums[i]: k += 1            res += j - k            j -= 1    return res
剑指Offer 45. 把数组排成最小的数
需要将快速排序算法修改为可以对字符串的字典序进行排序的方式。有一个问题是这里的快速排序必须先从右往左,应该是边界问题,还没细看。
代码:
123456789101112131415def minNumber(self, nums: List[int]) -> str:    def qsort(l, r):        if l >= r: return        i, j = l, r # dual pointers        while i < j:            while s[j] + s[l] >= s[l] + s[j] and i < j: j -= 1            while s[i] + s[l] <= s[l] + s[i] and i < j: i += 1            s[i], s[j] = s[j], s[i]        s[l], s[i] = s[i], s[l]        qsort(l, i-1)        qsort(i+1, r)        s = [ ...
剑指Offer 32-III. 从上到下打印二叉树III
之字形打印二叉树。奇数行从左到右,偶数行从右到左。
python数据结构:collections.deque
方法:deque.append()在队列尾部插入,deque.appendleft()在队列头部插入
代码:
12345678910111213141516171819def levelOrder(self, root: TreeNode) -> List[List[int]]:    if not root:        return []    deque = collections.deque([root])    res = []    while deque:        temp = collections.deque()        for i in range(0, len(deque)):            node = deque.popleft()            if len(res)%2 == 0:                temp.append(node.val)            else:         ...
Leetcode 400. 第N位数字
找规律题目。先找第几个数字,再从中取字符。
digit代表这一段数字的位数(1-9是1位,10-99是两位…)
times代表的是当前位数对应的数量级(10, 100, 1000…)
count代表的是当前位数、当前数量级的字符总数(比如1位的有9*1个,2位的有90*2个…)
先递推从n上减去每个数量级的数字总数直到剩下的n已经无法容纳下一级的字符总数,那么剩下的n就是介于两级之间了。用当前字符数的数量基数times加上n-1整除当前区段的位数就可以定位到是第几个数字了。
把这个数字变成字符串,n-1对digit的余数作为index,即可得到答案。
代码:
1234567891011def findNthDigit(self, n: int) -> int:    digit = 1    times = 1    count = 9    while n > count:        n -= count        digit += 1        times *= 10        count = 9 * digit * times    res = t ...
剑指offer 38. 字符串的排列
从今天起重新做人,打算用python刷题。因为java用得太少,感觉语法和类型没有肌肉记忆总会忘。py经常用,忘的概率会小一点点。
主要思路:
递归,DFS,剪枝。
递归终止:当DFS进行到len(s)-1时说明当前分支深度搜索已经完成,返回一个字符串。
递推:当DFS进行到第x位时,依次递推将x位和range(x, len(s)-1)位置的第i位交换,然后进入下一层递归dfs(x+1),递归结束返回当前一层后将交换的两位还原,全当无事发生。
剪枝:例如abbcc的输入字符串可能会导致两位交换后的DFS过程不能说是毫无差别,只能说是完全一致。这种情况在每一层递归的时候新建一个hashset保存本层已经固定处理过的字符,而在递推的过程中就可以对已经固定过的字符进行剪枝操作。
代码:
1234567891011121314151617def permutation(self, s: str) -> List[str]:    res = []    s_ = list(s)    def recur(x):        if x == len(s_) - 1:          ...
剑指offer 20. 表示数值的字符串
最清晰的方法是有限元自动机,继续盗一下K大的图。
然后用dict / hashmap把状态转移用键值对表达出来即可。字符串读入成字符数组,遍历字符元素匹配空格、正负号、数字、e以及小数点进行状态转移,如果不存在则直接返回false。遍历结束后如果停留在:空格、(连续或前面为小数点或空格或e的)数字、前面有数字的小数点,则符合规则返回true。
(我自己脑补的状态序列,所以序号和图上有一点出入)
123456789101112131415161718192021222324252627class Solution {    public boolean isNumber(String s) {        Map[] states = {            new HashMap<>() {{put(' ', 0); put('s', 1); put('d', 2); put('.', 3);}},            ...




