先上原题
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': , 'eggs': , 'return': }
# 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函数的作用是动态分配内存,以解决静态内存定长、不能手动释放等缺陷。
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