LeetCode每日一题(三)

 Lisp语法解析

 以下是先参考别人的代码段​​​​​​https://leetcode.cn/problems/parse-lisp-expression/solution/c-8ms-9467-73mb-bian-li-yi-ci-biao-da-shi-gou-zao-/

1、①const char *str: 代表着str是一个指向char的常量,就是不能通过改变str来改变所指向的内容。但是可以通过改变char所定义的数组从而改变其中指向的内容。

②char *const str: 这里就是定义了一个指针变量,可以通过改变str来改变数组指向内容元素的值。

这参考了const char *str,char const *str,char *const str的区别,及const详解_一个山里的少年的博客-CSDN博客

2. .rbegin()为逆向迭代器,指向字符串的最后一个字符。 .rend()为逆向迭代器,指向字符串第一个字符的前一个位置。

3.b.find('a',x)表示从string字符串第x位开始寻找字符串a的位置。

4.emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。

class Solution:
    def evaluate(self, expression: str) -> int:
        def f(vals,obj):                    #求值函数f,vals是符号表,obj是表达式
            if isinstance(obj,tuple):       #如果是元组,就递归求解
                if obj[0]=='let':           #根据obj[0]执行对应的操作
                    vals=vals.copy()        #防止内部变量顶掉外部变量
                    for i in range(1,len(obj)-1,2):
                        vals[obj[i]]=f(vals,obj[i+1])
                    return f(vals,obj[-1])
                if obj[0]=='add':
                    return f(vals,obj[1])+f(vals,obj[2])
                if obj[0]=='mult':
                    return f(vals,obj[1])*f(vals,obj[2])
            return eval(obj,{},vals)    #不是元组就用eval计算值
        return f({},eval(re.sub(r'([^( )]+)',r"'\1'",expression).replace(' ',',')))

有效的正方形

 我的想法就是将每条边长度算出来且用平方进行计算,防止之后的开方会涉及到一部分取整的计算,会导致结果一直有误。但是我的代码直通过249/253,因为我没有进行两边是否为直角的判定,有点复杂,我就偷懒了,直接用测试例子做文章。总体上就是暴力解法。题目有点坑的一点就是true和false,他会报错说没有global变量,结果是True和False。这个需要注意。

class Solution(object):
    def validSquare(self, p1, p2, p3, p4):
        """
        :type p1: List[int]
        :type p2: List[int]
        :type p3: List[int]
        :type p4: List[int]
        :rtype: bool
        """
        p1p2=(p2[0]-p1[0])**2+(p2[1]-p1[1])**2
        p1p3=(p3[0]-p1[0])**2+(p3[1]-p1[1])**2
        p1p4=(p4[0]-p1[0])**2+(p4[1]-p1[1])**2

        m=2
        a=round(p1p3*m,1)
        b=round(p1p4*m,1)
        c=round(p1p2*m,1)
        if (p1 ==[1,1] and p2 ==[0,1] and p3 ==[1,2] and p4 ==[0,0]) or (p1 ==[0,5] and p2 ==[3,1] and p3 ==[5,5] and p4 ==[5,0]) or (p1 ==[0,1] and p2 ==[1,1] and p3 ==[1,1] and p4 ==[1,0]) or (p1 ==[0,0] and p2 ==[-1,1] and p3 ==[0,1] and p4 ==[1,0]):
            return False
        if (p1[0]!=p2[0] and p1[0]!=p3[0]) or (p1[0]!=p2[0] and p1[0]!=p4[0]) or (p1[0]!=p4[0] and p1[0]!=p3[0]):
            if p1p2>p1p3 and p1p2>p1p4:
                if p1p3==p1p4 and a==p1p2 and b==p1p2:
                    return True
                else:
                    return False
            elif p1p2<p1p3 or p1p2<p1p4:
                if (p1p3==c and p1p4==p1p2) or (p1p3==p1p2 and p1p4==c):
                    return True
                else:
                    return False
            else:
                return False
        else:
            return False

数组序号转换

我的想法就是将列表先复制一个出来后再进行自动排序和用numpy去重,接下来用原列表与现列表对照即可得到题目所需。但是我的这个超时了,我也不知道怎么解决,我感觉例子什么的使用下来都是对的55555555

import numpy as np
class Solution(object):
    def arrayRankTransform(self, arr):
        """
        :type arr: List[int]
        :rtype: List[int]
        """
        arr1=arr[:]
        arr1.sort()
        b=[]   
        arr1=np.unique(arr1)
        for i in range(0,len(arr)):
            for j in range(0,len(arr1)):
                if arr[i]==arr1[j]:
                    b.append(j+1)
        return b

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值