使用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);}}, ...