剑指offer(2):字符串

C语言中的字符串

C语言中字符串的存储方式和数组类似,都是连续定长的内存块。字符串数组以\0结尾,所以会比正常数组多一位,char str3[5] = "1234"; //此处赋值字符串长度应小于5

常用字符串函数: <string.h>

字符串复制

  • char *strcpy(char *dest, const char *src),将字符串src复制给dest。
  • char *strncpy(char *dest, const char *src, int n),将字符串src的前n个字符复制给dest。
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char dest[30] = "hello world";
  6. char src[] = "carlsplace";
  7. printf("original :%s\n", dest);
  8. printf("after strncpy() :%s\n", strncpy(dest, src, 3));
  9. printf("after strcpy() :%s\n", strcpy(dest, src));
  10. return 0;
  11. }
  12. /******输出******
  13. original :hello world
  14. after strncpy() :carlo world
  15. after strcpy() :carlsplace
  16. ****************/

字符串拼接

  • char *strcat(char *dest, const char *src),将字符串src拼接到dest后面
  • char *strncat(char *dest, const char *src, int n)将字符串src的前n个字符拼接到dest后面
  1. int main ()
  2. {
  3. char src[50], dest[50], dest2[50];
  4. strcpy(src, "This is source.");
  5. strcpy(dest, "This is destination1.");
  6. strcpy(dest2, "This is destination2.");
  7. strcat(dest, src);
  8. printf("after strcat(): |%s|\n", dest);
  9. strncat(dest2, src, 9);
  10. printf("after strncat(): |%s|\n", dest2);
  11. return(0);
  12. }
  13. /******输出******
  14. after strcat(): |This is destination1.This is source.|
  15. after strncat(): |This is destination2.This is s|
  16. ****************/

字符串比较

  • int strcmp(const char *s1, const char *s2);,比较字符串s1和s2,返回s1-s2,相等返回0。strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符
  • int strncmp(const char *s1, const char *s2, int n);,比较字符串s1的和s2的前n个字符
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char a[] = "aBcDeF";
  6. char b[] = "aaCdEf";
  7. char c[] = "aacdef";
  8. char d[] = "aBcDeF";
  9. printf("strcmp(a, b) : %d\n", strcmp(a, b));
  10. printf("strcmp(b, a) : %d\n", strcmp(b, a));
  11. printf("strcmp(a, d) : %d\n", strcmp(a, d));
  12. printf("strncmp(b, c, 2) : %d\n", strncmp(b, c, 2));
  13. printf("strncmp(b, c, 3) : %d\n", strncmp(b, c, 3));
  14. return 0;
  15. }
  16. /******输出******
  17. strcmp(a, b) : -31
  18. strcmp(b, a) : 31
  19. strcmp(a, d) : 0
  20. strncmp(b, c, 2) : 0
  21. strncmp(b, c, 3) : -32
  22. ****************/

字符串查找

  • char * strchr (const char *str, int c),其中参数c须传入字符,会自动被转化为ASCII码。函数返回字符c第一次出现位置的指针
  • char *strrchr(const char *str, int c),函数返回字符c最后一次出现位置的指针
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4. char s[] = "012345A7890123456789012345A7890";
  5. char *p1 = NULL;
  6. char *p2 = NULL;
  7. p1 = strchr(s, ‘A‘);
  8. p2 = strrchr(s, ‘A‘);
  9. printf("%s\n", s);
  10. printf("%s\n", p1);
  11. printf("%s\n", p2);
  12. return 0;
  13. }
  14. /******输出******
  15. 012345A7890123456789012345A7890
  16. A7890123456789012345A7890
  17. A7890
  18. ****************/

字符串长度

  • unsigned int strlen (char *s),返回字符串长度,不包含\0,注意其与sizeof()的区别
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char str1[] = "The Arch-based Manjaro is a great Linux distribution.";
  6. char str2[100] = "The Arch-based Manjaro is a great Linux distribution.";
  7. printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1));
  8. printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2));
  9. return 0;
  10. }
  11. /******输出******
  12. strlen(str1)=53, sizeof(str1)=54
  13. strlen(str2)=53, sizeof(str2)=100
  14. ****************/

Python中的字符串

Python中的字符串可以看做list,Python中提供了方便的字符串操作方式。

字符串运算符

  • 使用+可直接进行字符串拼接
  • 使用*可重复输出字符串
  • 使用[i][:]可对字符串索引和切片
  • innot in可用来判断字符(串)之间的包含关系

常用字符串内建函数string.xxx

  • string.find(str, beg=0, end=len(string))

    检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

  • string.index(str, beg=0, end=len(string))

    跟find()方法一样,只不过如果str不在 string中会报一个异常.

  • string.format()

    格式化字符串

  1. >>> "{:.2f}".format(3.1415926)
  2. `3.14`
  • string.isalnum()

    如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False

  • string.isalpha()

    如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False

  • string.isdecimal()

    如果 string 只包含十进制数字则返回 True 否则返回 False.

  • string.isdigit()

    如果 string 只包含数字则返回 True 否则返回 False.

  • string.islower()

    如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

  • string.rstrip()

    删除 string 字符串末尾的空格.

  • string.split()

    默然以空格为界分割字符,括号内可填入自定分割字符,分隔符可以为普通字符,也可以为\n等转义字符。

  1. >>> ‘carl_will_go‘.split(‘_will_‘)
  2. [‘carl‘, ‘go‘]
  • ‘string.join(seq)‘

    以string为间隔拼接序列

  1. >>> ‘_‘.join([‘a‘, ‘b‘, ‘c‘])
  2. ‘a_b_c‘
  • `string.find(str)‘

    查找str在string 中位置,有则返回下标,没有返回-1

  1. >>> ‘abc‘.find(‘b‘)
  2. 1
时间: 2024-10-13 22:01:46

剑指offer(2):字符串的相关文章

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

【剑指offer】字符串的组合

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471 剑指offer上的拓展题目,输入一个字符串,输出该字符串的字符的所有组合,比如输入字符串:abc,输出a.b.c.ab.ac.bc.abc. 思路:与上一题类似,也可以用递归求解.可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m).原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和.对于求C(n, m),从第一个字符开始扫描,每个字符有两种

剑指offer (49) 字符串转数字

class Test { public: Test() : n2(0), n1(n2 + 2) { } private: int n1; int n2; }; 调用构造函数之后,n1个n2各为多少? 分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化 当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值 故 n1 为随机值,n1初始完之后,n2初始化为0 最终 n1为随机值,

【剑指offer】字符串转整数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000). 输出: 对应每个测试案例,若输入为一个合法的字符串(即代表一个整数),则输出这个整数.若输入为一个非法的字符串,则输出"My God". 样

剑指offer 52.字符串 正则表达式匹配

题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 解题思路 解这题需要把题意仔细研究清楚,反正我试了好多次才明白的.   首先,考虑特殊情况:   1&

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于

剑指offer—替换字符串中空格

题目: 实现一个函数,把字符串中的每个空格替换成"%20".加入输入"we are happy.",则输出"we%20are%20happy.". 时间复杂度为O(n^2) 基本思想:从前往后把字符串中的空格替换成%20. 假设字符串的长度为n,对每个空格字符,需要移动后面O(n)个字符,因此总的时间复杂度为O(n^2). 时间复杂度为O(n) 基本思想:先遍历找出空格总数,并计算出替换之后的字符串的总长度.然后从字符串的后面开始复制和替换. 所

剑指offer——替换字符串

总结:先计算出总共有多少空格,count++:然后从后往前遍历,每遇到一个空格,count--: 替换空格 参与人数:2119时间限制:1秒空间限制:32768K 通过比例:20.23% 最佳记录:0 ms|8552K(来自  牛客游客) 题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 完整代码: public class StringreplaceSpace { public

剑指Offer——把字符串转换成整数

题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 分析: 只可能在最开始一位出现符号,所以我们特殊判断第一位,之后都得是数字字母,不然不合法. 代码: 1 class Solution { 2 public: 3 int StrTo

【剑指offer】字符串替换

请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. *StringBuffer 扩容 str.setLength(扩容大小) *思路:将原字符数组扩容至目标大小后,从后往前移动字符串,可大大减小移动次数 public class Solution {         public String replaceSpace(StringBuffer str) {