作者: ShiYu

  • 操场上的爱情

    封校期间,学校里多了好多活动,今晚是草场音乐节第一天,唱歌,跳舞,还有好多人在这里表白呢!

  • 网课搜题

    懒惰是第一生产力

    今天数据库实验作业马上就要截止啦,但是题目百度也找不到好难,于是想用网课脚本试试,搜了一下果然可以,咱就想也做一个搜题工具,本来想直接找个接口然后用React撸个前端直接用就可以了,结果网上找的各种接口都是收费限制啥的,不然就是失效了,然后就想到了油猴脚本,他们那应该有最新可用的接口,在阅读某个js脚本的时候找到他们自用的接口地址和参数:

    接口

    如图,apihost就不公开了,有需要可以私聊我,上面已经给出路径和参数了,然后我用react写了个前端发Ajax的时候产生 500 错误,emmm 忘了跨域问题了,看来只能自己写个服务端了,本地用python写了个中转,然后重新发送Ajax,!!!成功了,好耶,下面是演示图片和视频:

    Code
    演示视频

    3/21更新

    本来昨天晚上本地测试成功想部署在服务器给大家用的,就用node.js重写了后端方便部署嘛,结果调试了几个小时还没弄好,在服务器中返回的老是提示请升级,估计对方的接口对请求啥的做了限制,今天把python后端部署一次就成功啦!

    测试地址:http://wk.shiyu.dev/

  • 疫情之下

    疫情终会过去,静候春暖花开。

    疫情之下的山东

    这一时期的山东疫情要比20年更加猛烈,我记得临沂的确诊数目20年之后从没这么快速增加过,3月14日开始到现在突然增加到17例了,更别说还有青岛和滨州,现在大部分地区应该都停课了,开始上网课,估计只有高三的同学还在教室上课了。这周末我们也接到了网上课程的通知,虽然泰安目前并没有疫情。

    网课通知
    疫情应对措施
    准备网课的测试啦

  • 微信小程序

    今天去老师办公室讨论关于这个设备管理管理的小程序的方案,这算是我在老师手中接到的第一个项目叭,之前老师也给我推过几次小程序的项目,但是都因为我从来没去学过小程序就拒绝了,这次接也是因为这个项目开发周期较长可以边学边做,而且最近确实挺闲的,多学点东西也好~

    这当然是先给甲方做做页面啦,跟做PPT似的,做完界面以后再和甲方商量具体要更改的确定后再开发后端功能。

  • LeetCode 记录

    刷题总是三分钟热度,不知道能坚持多久

    以此来记录无聊又有趣的算法生活,更新每日一题的情况

    2022/3/4

    2104. 子数组范围和

    这题之前在周赛的时候做过,不过当时用的 python 且时间复杂度为 $ O(n^{2}) $ 但是超时了,今天的每日一题又遇到它啦,看了看题解好像大部分都是$ O(n^{2}) $ 的解法呀,可能当时代码写的有问题叭,今天再做一遍怎么又超时了!!!

    class Solution:
        def subArrayRanges(self, nums: List[int]) -> int:
            ans = 0
            for i in range(len(nums)):
                for j in range(i + 1, len(nums) + 1):
                    ans += max(nums[i:j]) - min(nums[i:j])
            return ans
    class Solution:
        def subArrayRanges(self, nums: List[int]) -> int:
            ans, n = 0, len(nums)
            for i in range(n):
                minVal, maxVal = inf, -inf
                for j in range(i, n):
                    minVal = min(minVal, nums[j])
                    maxVal = max(maxVal, nums[j])
                    ans += maxVal - minVal
            return ans

    我的做法是用py用多了,老想直接切片,这样耗时太多啦,使用 $ minval $ 和 $ maxval $ 来储存最大最小值能够省下一部分时间。

    但是这样还是 $ O(n^{2}) $ 的时间复杂度,怎么样才能进一步优化呢,这里可以使用单调栈,将时间复杂度压缩到 $ O(n) $ 显然我是不会用单调栈了,等啥时候学了再更新方法~

    2022/3/5

    521. 最长特殊序列 Ⅰ

    一个脑筋急转弯,如果两个字符串不相等则最长特殊序列就是两个字符串中较长的那个,否则没有子序列返回-1

    class Solution:
        def findLUSlength(self, a: str, b: str) -> int:
            return max(len(a), len(b)) if a != b else -1
    

    2022/3/6

    2100. 适合打劫银行的日子

    浙江农信银行出的题目,哈哈哈哈,用了前缀和的思想,很简单的一道题

    class Solution:
        def goodDaysToRobBank(self, security: List[int], time: int) -> List[int]:
            n = len(security)
            g = [0 for i in range(n)]
            for i in range(1,n):
                if security[i] > security[i - 1]:
                    g[i] = 1
                elif security[i] < security[i - 1]:
                    g[i] = -1
            a,b = [0 for i in range(n+1)],[0 for i in range(n+1)]
            for i in range(1,n+1):
                a[i] = a[i - 1] + (1 if g[i - 1] == 1 else 0)
                b[i] = b[i - 1] + (1 if g[i - 1] == -1 else 0)
            ans = []
            for i in range(time,n-time):
                if a[i - time + 1] == a[i + 1] and b[i + 1] == b[i + time + 1]:
                    ans.append(i)
            return ans

    2022/3/7

    504. 七进制数

    一个简单的数学题,由十进制转换成任意进制可以使用基数乘除法,本题指定为整数所以使用除基数取余法即可。虽然简单但是要记得处理 0 和 负数!

    class Solution:
        def convertToBase7(self, num: int) -> str:
            if num == 0:
                return '0'
            ans = ''
            flag = True
            if num < 0:
                num = - num
                flag = False
            while num:
                ans = str(num % 7) + ans
                num //= 7
            return ans if flag else '-' + ans

    2022/3/8

    2055. 蜡烛之间的盘子

    也是一道前缀和的题目,寻找$ [x, y] $之间的盘子数量可以理解为寻找这个区间内最左边和最右边蜡烛之间共有几个盘子,我们可以预先处理出left,right数组用来记录第 index 的最邻近左边或者右边的第一个盘子,然后用preSum求出到第 index 个字符之前一共有多少个盘子,直接 $ preSum[right] – preSum[left] $ 即可求出答案

    class Solution:
        def platesBetweenCandles(self, s: str, queries: List[List[int]]) -> List[int]:
            preSum = [0] * len(s)
            left,right = [0] * len(s), [0] * len(s)
            temp = -1
            for i in range(len(s)):
                if s[i] == '*':
                    preSum[i] = preSum[i-1] + 1
                else:
                    preSum[i] = preSum[i-1]
                    temp = i
                left[i] = temp
            temp = -1
            for i in range(len(s) - 1,-1,-1):
                if s[i] == '|':
                    temp = i
                right[i] = temp
            ans = []
            print(left)
            for i, (x, y) in enumerate(queries):
                x, y = right[x], left[y]
                if x >= 0 and y >= 0 and x < y:
                    ans.append(preSum[y] - preSum[x])
                else:
                    ans.append(0)
            return ans