算法一隅
程序归根结底,是算法+数据的组合,语言只是一种实现方式。
本栏将由浅入深地逐层从:问题、思路、代码三部分阐述其算法的实现方法。同时也是记录自己的学习和成长,错误之处欢迎斧正。
Joy_917
一个被修电脑耽误的民谣厨子
展开
-
最小路径和-LeetCode
题目题目链接:https://leetcode-cn.com/problems/minimum-path-sum/思路:典型的一道动态规划题,和跳台阶十分类似,因为根据说明,每个格子的上一步只有两种情况:从上边来,从左边来所以如果我们规定 dp[i][j] 为到达单元格 grid[i][j] 的最小路径,那么有以下四种情况:i=j=0,即左上角,没有前置格子,所以跳过i=0,j>0,上边界,没有来自上面的格子i>0,j=0,左边界,没有来自左面的格子i>0,j>原创 2021-01-31 11:06:35 · 140 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树-LeetCode
题目:题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/submissions/思路:题目给定的无重复元素是关键,否则无法根据前序在中序里找到每个子树的根节点规律就是前序的每个子序列的第一个元素,在中序里都能够将中序切为它自己的左右子树比如题目给定的3,将中序划分为 [9]、[15,20,7],9即为3的左子树的根结点,前序剩余的[20,15,7]的原创 2021-01-28 23:22:52 · 132 阅读 · 0 评论 -
只出现一次的数字-LeetCode
题目:题目链接:https://leetcode-cn.com/problems/single-number/思路:题目限定了空间和时间,所以常规的暴力法不行,否则可以用hash存储元素出现的次数这里使用异或来解交换律:a ^ b ^ c <=> a ^ c ^ b任何数于0异或为任何数 0 ^ n => n相同的数异或为0: n ^ n => 0比如:var a = [2,3,2,4,4],2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4原创 2021-01-26 22:43:07 · 79 阅读 · 0 评论 -
反转链表-LeetCode
题目:题目链接:https://leetcode-cn.com/problems/reverse-linked-list/思路:三种解法:暴力法:遍历一次用栈存储每个Node,然后依次将栈中元素pop并链接起来形成新链表,这里有个坑是栈底Node的next需要置空,否则会形成环迭代法,使用三个指针来往后滑动,依次改变指针指向递归法代码(迭代法):class Solution { public ListNode reverseList(ListNode head) {原创 2021-01-26 00:01:33 · 132 阅读 · 0 评论 -
除自身以外数组的乘积-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/product-of-array-except-self思路:开始想用除法,先全部乘起来,然后每一个都除以当前的元素值就可以了,然后有特殊情况0,而且题目限定死了所以我们可以用类似迭代的思想,对于每一个元素之外的乘积分为前后两部分,复用输出数组,减少空间占用代码:class Solution { public int[] productExceptSelf(int[] nums) {原创 2021-01-25 01:55:50 · 188 阅读 · 0 评论 -
二叉树展开为链表-LeetCode
题目:题目链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/思路:这题难在改变指针指向的时候,原本的右指针的子结点需要保存,这里使用递归,右左根的顺序访问结点这样栈桢在回退的时候,顺序就是根左右我们就可以先将当前根结点也就是上一个结点的左结点取出来,存进临时变量,在下一次栈桢回退的时候,作为上一个结点的右结点。代码:/** * Definition for a binary tree nod原创 2021-01-22 01:15:40 · 259 阅读 · 0 评论 -
组合总和-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/combination-sum/思路:涉及到排列、组合这种题目,多多少少都会涉及到回溯思想这题关键在于「元素可以无限制被选取」,所以和全排列那种不一样,不能用used数组来缩小分枝规模其余思路符合典型的回溯算法,即每次选取下一次应用的数字,如果不符合则往上会退一步,选取除去该数字之外的另一个数排序过后可以减少不必要判断,比如235和5,如果2+3都已经大于给定数字5了,那么回退一步的2+5就没必要判断了,因原创 2021-01-20 01:00:17 · 113 阅读 · 0 评论 -
根据身高重建队列-LeetCode
题目:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。示例 1:输入:people = [[7,0],[原创 2021-01-18 22:45:30 · 180 阅读 · 0 评论 -
旋转图像-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/rotate-image/思路1(暴力法):首先暴力法,遍历一次用一个中间矩阵保存旋转过后的元素位置,再遍历一次将中间矩阵的值赋给原矩阵但是由于题目要求原地旋转,所以放弃,但是保留下思路代码代码1:class Solution { public void rotate(int[][] matrix) { int n = matrix.length; int[][]原创 2021-01-17 16:52:17 · 153 阅读 · 0 评论 -
二叉树的中序遍历-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/思路:递归或者使用栈来模拟递归时间复杂度都是O(n)代码(递归):/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tree原创 2021-01-16 23:13:06 · 104 阅读 · 1 评论 -
二叉树的深度-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/思路:就使用递归深度优先遍历就好了,如果当前结点非空,那么返回深度就默认+1时间复杂度为O(n),因为每个结点只被访问一次代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2021-01-14 23:56:22 · 155 阅读 · 1 评论 -
比特位计数-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/counting-bits/思路:暴力法直接遍历每个数字,并对数字进行二进制转换和统计1的个数迭代法就是找规律,先列出前三个值,后面的可以根据规律直接取个数,需要注意的是结果的返回,需要根据输入切片返回指定值代码:class Solution: def countBits(self, num: int) -> List[int]: ''' # 暴力法原创 2021-01-13 22:31:57 · 284 阅读 · 0 评论 -
括号生成-LeetCode
题目:原文链接:https://leetcode-cn.com/problems/generate-parentheses/思路:暴力法是递归生成所有组合方式,同时判断是否符合要求回溯法,不需要在生成完整的组合之后再判断,因为在每一个位置最多有两种摆放方法:当前还有左括号剩余时,放置左括号;当前组合中已经放置的左括号的个数大于右括号个数时,放置右括号然后回退一步,逆操作状态值(此处状态值为临时存储空间),查看接下来剩余哪种情况代码:class Solution: def ge原创 2021-01-12 23:23:19 · 171 阅读 · 1 评论 -
全排列-LeetCode
题目:链接:https://leetcode-cn.com/problems/permutations/思路:这是一道典型的回溯算法题,需要注意的是全排列是有顺序之分的,123和132是两个结果基本思路就是深度优先遍历,每次固定一个元素(添加至temp中),并保存当前元素已经被使用used,然后在剩下的元素中继续固定,当递归深度depth和全排列长度相等时,保存一下中间数组temp的值,这里需要注意temp是引用,需要复制数组然后向上回溯一层,即回退temp的最后一个值,找找有没有别的没用原创 2021-01-10 23:39:05 · 556 阅读 · 0 评论 -
翻转二叉树-LeetCode
题目:链接:https://leetcode-cn.com/problems/invert-binary-tree/思路:这题在剑指offer上也有,就是递归,然后交换下左右子树就可以了代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int原创 2021-01-08 01:02:06 · 107 阅读 · 0 评论 -
汉明距离-LeetCode
题目:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/hamming-distance思路:首先看题目就知道肯定是位运算,位运算无非就是按位^、&或者移位根据解释,可以发现,按位^之后结果设为X,箭头位置会变成1,其他位置为0,那1的数量就是「汉明距离」了所以题目转换为求X的二进制中1的个数,这里有两种方法第一种是使用内置函数将X转换为二进制字符串,求1的个数第二种是向右移位,并和1按位&,根据结果判断该位是否位1原创 2021-01-08 00:33:32 · 172 阅读 · 2 评论 -
子集-LeetCode
题目:给你一个整数数组 nums ,返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/subsets思路:个人觉得这道题没有说清楚,整数数组是否会含有重复数字,如果是的话那官方题解也原创 2021-01-03 22:50:08 · 118 阅读 · 2 评论 -
合并二叉树-LeetCode
题目:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。注意: 合并必须从两个树的根节点开始。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-two-binary-trees思路:直接使用先序遍历的递归法,对左右子树进行判断和叠加,原创 2021-01-02 15:17:39 · 309 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.示例1输入:[[1,2],[3,4]]返回值:[1,2,4,3]思路:这题没什么花里胡哨的算法,就是把题目拆解代码实现我们可以看成顺时针每一圈打印一次,一圈一圈往内部收缩每一圈四个边边,每一边打印单独的逻辑,打印完原创 2020-12-31 00:48:23 · 77 阅读 · 0 评论 -
数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字示例1输入:[1,2,3,4,5,6,7,0]返回值:7思路:开始用了暴力法,两层循环两两比对,果然超时了查看题解,思路和快排思想十分类似,本质是分治然后归并简单来说,就是把大数组M切分成一个个小数组比如A、B,组内比较计数然后排序原创 2020-12-30 00:27:40 · 283 阅读 · 0 评论 -
翻转单词顺序列
题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?示例1输入:“nowcoder. a am I”返回值:“I am a nowcoder.”思路:这题没啥好说的,根据空格切原创 2020-12-28 21:51:28 · 96 阅读 · 0 评论 -
删除链表中重复的结点
题目:题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入:{1,2,3,3,4,4,5}返回值:{1,2,5}思路:本题考查链表的指针操作,暴力法是用set记录重复的值,第二次遍历的时候删除就好了优化后可以直接在一次遍历的时候,判断当前结点的下一个结点和下下个结点的值是否相等,是的话进行删除。代码原创 2020-12-28 00:12:24 · 246 阅读 · 0 评论 -
正则表达式匹配
题目:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配示例1输入:“aaa”,"aa"返回值:true思路:用递归来模拟匹配逻辑,有无*是下一步判断的关键需要注意的是数组越界,所以此处用python的切片来强调逻辑代码:# -*- coding:u原创 2020-12-27 03:25:46 · 263 阅读 · 2 评论 -
链表中倒数第K个结点
题目:输入一个链表,输出该链表中倒数第k个结点。示例1输入:1,{1,2,3,4,5}返回值:{5}思路:这题要注意的是,输出的是结点而不是结点的值暴力法就是先遍历一次,拿到总结点数s,再遍历一次走s-k+1个结点就OK了,或者遍历链表用一个HashMap来存储「索引-结点」,空间换时间当然了,上面的方法的缺点不是遍历两次就是需要开辟额外空间标准解法是使用快慢指针:先使一个快指针指向第k个结点,慢指针指向头结点;然后同时移动快慢指针,当快指针到达末尾时,慢指针就是倒数第k个结点了,因原创 2020-12-21 22:19:20 · 102 阅读 · 0 评论 -
字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。示例1输入:“ab”返回值:[“ab”,“ba”]思路:这题有两点需要注意:要按字典顺序排列,可能存在重复字符我们观察示例是有规律可循的,固定a,bc全排列;然后固定b,ac全排列;最后固定c,ab全排列于是我们可以先对原创 2020-12-20 19:07:04 · 123 阅读 · 0 评论 -
复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路1-三步法:这道题主要是考察链表指针的操作,在理解题意的前提下分为三步首先要拷贝简单链表的每个结点至原结点的下一个位置(拷贝值)其次要拷贝其中的random指针(拷贝结点的random指针指向原结点random指针的下一个结点),因为就相当于指向了拷贝原创 2020-12-15 02:37:28 · 246 阅读 · 0 评论 -
最小的K个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。示例1输入:[4,5,1,6,2,7,3,8],4返回值:[1,2,3,4]思路:刚看到这道题的时候,脑海中浮现的就是Redis,通过一个缓存,不断更替其中的热点数据但其实这道题有很多种解法,既可以in-place排序后取出前k个数,也可以利用有序的额外k大小的空间,更替其中较小值,保持k个数如果是排序的话那方法就多了,十大经典排序算法都可以安排上所以我偏要模原创 2020-12-13 00:03:26 · 109 阅读 · 0 评论 -
序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过原创 2020-12-12 02:13:25 · 364 阅读 · 0 评论 -
机器人的运动范围
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?示例1输入:5,10,10返回值:21思路:由于没有要求路径,所以强行求出满足的格子数量就可以了这里注意两个边界条件:坐标的数位和、给定的行列原创 2020-12-11 00:50:22 · 1795 阅读 · 1 评论 -
按之字形顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。示例1输入:{8,6,10,5,7,9,11}返回值:[[8],[10,6],[5,7,9,11]]思路:这题相当于二叉树按层遍历,但是奇数层和偶数层顺序相反所以我们可以在递归层次遍历(可参考另一篇博客 把二叉树打印成多行)的基础上,反转下奇数层的值即可代码:import java.util.ArrayList;/*public原创 2020-12-09 02:19:44 · 203 阅读 · 0 评论 -
二叉搜索树的第K小的结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。输入:{5,3,7,2,4,6,8},3返回值:{4}说明:按结点数值大小顺序第三小结点的值为4思路:首先二叉搜索树特点左小右大,所以如果是中序遍历的话,正好是一个升序序列所以我们可以在中序遍历的基础上同时计数,第K小=从小到大第K个代码:/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2020-12-06 21:23:22 · 221 阅读 · 0 评论 -
树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1:输入:{8,8,#,9,#,2,#,5},{8,9,#,2}返回值:true思路:如果B是A的子结构,那么A中必定有一个结点Pa,与B的根结点Pb相同,且它们的左右子树也相同,所以我们很自然想到要利用递归,对所有A的结点做判断(包括根结点)如果B已经没有子结点了,说明遍历完了B,返回true如果A已经没有子结点了,很显然返回false最后注意下输入判断就ok了代码:/**p原创 2020-12-05 12:37:43 · 149 阅读 · 0 评论 -
滑动窗口的最大值
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,原创 2020-12-05 00:17:44 · 302 阅读 · 1 评论 -
二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。示例1输入:[4,8,6,12,16,14,10]返回值:true思路:二叉搜索树,满足任意左子树的值都小于该结点,右子树都大于该结点同时后序遍历顺序为:左右根以示例来说,我们可以直接得到该二叉树的根节点为最后一个元素10,并且假设该序列可以重建二叉搜索树的话,一定存在一个位置,使得根节点能够将序列分为左右子树,且他们都满足上面两个特点原创 2020-12-04 02:40:55 · 336 阅读 · 0 评论 -
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例1输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值:{1,2,5,3,4,6,7}思路:首先明白前序:根左右;中序:左根右所以拿示例来说,根据给定的前序,我们知道1是根结点,在给定的中序里,1左边的是左子树的中序列[32原创 2020-12-03 00:33:18 · 73 阅读 · 0 评论 -
二叉树的前序遍历
题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。思路1:递归法很简单,就是前序遍历的递归形式,然后在处理当前节点的时候把值放进去就好了。代码1:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode原创 2020-12-01 22:38:38 · 124 阅读 · 0 评论 -
删除排序数组中的重复项2
题目:给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii示例 1:输入:nums = [1,1,1,2,2,原创 2020-12-01 21:15:25 · 140 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例1:输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值:true思路:这题关键在于从左至右递增,且从上到下递增,我们知道递增序列中的数字查找二分法是最快的方法,符合这题给出的信息。不过因为涉及到二维数组,所以要稍微变一下思路原创 2020-11-29 12:44:04 · 129 阅读 · 0 评论 -
扑克牌顺子
题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。现原创 2020-11-29 00:23:21 · 175 阅读 · 2 评论 -
替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:首先就不考虑使用自带的replace函数了,不然没有意义;开辟额外空间也可以做,比如用个StringBuilder在遍历判断的同时来拼接字符即可。这里使用in-place方法来实现。如果不开辟新的字符串,我们可以先计算出空格的数量,逆序遍历字符串,将空格后的字符整体后移两位,在前面补上%20(不顺序替换是因为那样每遇到一原创 2020-11-28 01:44:21 · 122 阅读 · 0 评论