leetcode随机刷chapter1678

文章介绍了LeetCode上的一道字符串处理问题,涉及C++、Python和C三种语言的解决方案。主要操作包括字符串声明、拼接、条件判断以及特定字符串处理函数如substr和join的使用。C++中的substr用于截取字符串,Python的join用于连接字符串,而C语言则利用strlen、malloc和sprintf处理字符串内存和格式化输出。
摘要由CSDN通过智能技术生成

1678. 设计 Goal 解析器

是一个比较简单的字符串处理任务,从这个简单的字符串处理任务归纳一下字符串处理的相关操作

先上原题
在这里插入图片描述
在这里插入图片描述
leetcode上的题总给我一种很难的错觉(当然确实很多很难)
每次读完都觉得自己没有学过语文。
所以直接看示例就好了,这么一看就是简单的替换。
(可能是我自己把command当作一个特殊的的含义,其实就是一个变量名罢了)

上一段C++的代码

class Solution {
public:
    string interpret(string command) {
        int i = 0;
        int n = command.size();
        string ans;
        while(i < n){
            if(i+1 <= n && command.substr(i , 1) == "G"){
                i++;
                ans += "G";
            }
            else if(i+2 <= n && command.substr(i , 2) == "()"){
                i += 2;
                ans += "o";
            }
            else{
                i += 4;
                ans += "al";
            }
        }
        return ans;
    }
};

因为我很少用C++,所以我感到新奇的地方还是蛮多的,可能有的发现比较白痴hhhhh

1.对于字符串的声明:
string 字符串名;
2.两个字符串的拼接:
字符串1 += 字符串2;
3.对于像这种要索引到当前位置之后的位置的时候,也就是说会发生i+4之后
越界的情况发生,我们就在判断的时候加入i+4<=n的判断条件。我个人观点
,不管题目情形如何,都要加上限制,而且注意等号这些问题,否则有些可
能会归并到else里面
4.就是最主要的substr()
substr有2种用法:
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:
sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:
sub2 = "567"

上一段python的题解

class Solution:
    def interpret(self, command: str) -> str:
        a=[]
        for i,c in enumerate (command):
            if command[i] == 'G':
                a.append('G')
            elif command[i] == '(':
                 a.append('o' if command[i+1] == ')' else 'al') 
           
        return ''.join(a)

我也很少用python来写leetcode|||||qaq

1.从def的声明开始
python里的def 方法中->代表什么意思?
我们先回答一波:
-> 主要是标记返回值数据类型;

我们根据这个问题来一段代码示例:
def f(ham: str, eggs: str = 'eggs') -> str:
    print("Annotations:", f.__annotations__)
    print("Arguments:", ham, eggs)
    return ham + ' and ' + eggs

f('spam')
# Annotations: {'ham': <class 'str'>, 'eggs': <class 'str'>, 'return': <class 'str'>}
# Arguments: spam eggs
-> 主要是标记返回值数据类型;
拿上面例子来说,在函数f中,标记参数ham为str类型,eggs为str类型;
return的值为->后面标记的类型str。
这样写的话,我们光看代码就可以知道该方法返回什么类型的数据,
而不需要去调试。
但是如果指定不一致呢,比如说,我们标记f的返回结果为int,
但是实际结果却是str。此时,开发工具里面应该会报错,
提示返回值不对,但是程序照样正常运行,不会抛异常。
2.首先声明一个列表,然后用append方法进行字符串拼接。
然后经典的for i , c in enumerate (command):
i用作个数便利,c用作command的内容遍历。
这个语句在写视觉作业的时候用的还蛮多的
3. a.append('o' if command[i+1] == ')' else 'al') 
这个语句还是蛮巧妙地,最好掌握。这个对于条件判断是需要继续进行
后续遍历时很是使用,这句话可能不好理解。
4. return ''.join(a)
 1.join函数的语法及用法
(1)语法:'sep'.join(sep_object)
参数说明
sep:分割符,可为“,、;”等。
sep_object:分割对象,可为字符串、以及储存字符串的元组、列表、字典。
(2)用法:连接任意数量的字符串(包括要连接的元素字符串、元组、列表、
字典),用新的目标分隔符连接,返回新的字符串。
举几个栗子
2.join函数的实例
(1)对象为字符串
';'.join('abc') #输出结果为:'a;b;c'  
string1 = 'good idea'#定义字符串
' '.join(string1)  输出结果:'g o o d   i d e a' 
#说明:由于字符串里没指明按字符串之间是怎么连接的,
默认每个字符之间插入目标字符

(2)对象为元组
tuple1 = ('a','b','c')  #定义元组tuple1
'、'.join(tuple1)
>>>‘a,b,c’ 
tuple2 = ('hello','peace','world')  #定义元组tuple2
' '.join(tuple2)
>>>'hello peace world'

(3)对象为列表
b = ['a','b','c'] #定义列表
'、'.join(b)
>>> a、b、c
list1 = ['hello','peace','world'] #定义列表
' '.join(list1)

>>>’hello peace world‘

(4)对象为字典
c={'hello':1,'world':2}
';'.join(c)
>>>'hello;world'
d = {'hello':'hi','world':'2'}
' '.join(d)
>>>'hello world'

3.易错点及解决办法
(1)问题:储存非字符串的元组、列表、字典等报错,比如元组储存数字进行连接
a = (1,2,3) #定义元组a
';'.join(a)
#报错:TypeError: sequence item 0: expected str instance, int found

 (2)解决办法:要将数字连接起来成为一个字符串,则结合for循环语句并将数字转为字符串再连接起来
a = (1,2,3) #定义元组a
';'.join(a)
 
b = (186234,1385475,1235462)
';'.join(str(i) for i in b)
 
#调用set函数去重处理
e = (1,2,3,2) #定义元组a
'、'.join(str(i) for i in set(e))

注意:分割对象储存的对象要为字符串,否则会报错

来一段C语言的代码

char * interpret(char * command) {
    int len = strlen(command);
    char *res = (char *)malloc(sizeof(char) * (len + 1));
    int pos = 0;
    for (int i = 0; i < len; i++) {
        if (command[i] == 'G') {
            pos += sprintf(res + pos, "%s", "G");
        } else if (command[i] == '(') {
            if (command[i + 1] == ')') {
                pos += sprintf(res + pos, "%s", "o");
            } else {
                pos += sprintf(res + pos, "%s", "al");
            }
        }
    }
    return res;
}
时间复杂度:O(n),其中 nnn 表示字符串的长度。
		   我们只需遍历一遍字符串即可。
空间复杂度:O(1)。除返回值以外不需要额外的空间。

传统C语言

1.strlen()函数,求字符串长度
2.char *res = (char *)malloc(sizeof(char) * (len + 1));
还是回顾一下malloc函数吧
在使用malloc函数前,需要调用头文件# include <malloc.h>
malloc函数的作用是动态分配内存,以解决静态内存定长、不能手动释放等缺陷。
malloc的使用方法:
int *p = (int *)malloc(sizeof(int));
*p = 1;
free(p);

还有一种写法:
int *p;
p = (int *)malloc(sizeof(int));
free(p);

其中,p为一个整型指针变量,由int *p = (int*)malloc(sizeof(int))可以看出来
,这句话在给*p分配内存.

malloc函数支持一个形参(该形参就是字节大小),而sizeof(int)计算出了
我们需要的字节数,malloc函数的返回值是一个地址,把分配的动态内存
的地址赋给指针p,就是在为*p开辟了一块动态内存。

free(p)则是释放了p所指向的内存。
3.sprintf()

其中malloc相关知识链接: link
关于二级指针问题链接: link
关于sprintf()相关问题链接: link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值