字符串问题总结
解析:整数转化为字符串,可以采用加‘0’,再逆序的办法 整数加‘0’就会隐性转化成char类型的数。
1 #include <stdio.h> 2 3 int main() 4 { 5 int num = 12345,i = 0,j = 0; 6 char a[7],b[7]; 7 while(num) 8 { 9 a[i] = num%10 + '0'; 10 num = num/10; 11 i++; 12 } 13 a[i] = 0; 14 i = i-1; 15 printf("%s\n",a); 16 while(i>=0) 17 { 18 b[j] = a[i]; 19 j++; 20 i--; 21 } 22 b[j] = 0; 23 printf("%s\n",b); 24 25 return 0; 26 }
2.字符串转化成整数
可以采用减‘0’再乘10累加的办法,字符串减‘0’就会隐性转化成int类型的数。
1 #include <stdio.h> 2 3 int main(void) { 4 5 char a[] = "12345"; 6 int i = 0,num = 0; 7 while(a[i]) 8 { 9 num = num*10 + (a[i]-'0'); 10 i++; 11 } 12 printf("%d\n",num); 13 14 return 0; 15 }
3.将小写字母换算成大写字母
1 #include <stdio.h> 2 3 int main(void) { 4 5 char a[] = "asdfg",b[7]; 6 int len,i = 0; 7 len = 'a' - 'A'; 8 printf("%c%c%c%c%c\n",a[0]-len,a[1]-len,a[2]-len,a[3]-len,a[4]-len); 9 10 return 0; 11 }
4.将字符串逆序
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(void) { 5 6 char a[] = "asdfgh",b[10]; 7 int i = 0,j = 0; 8 j = strlen(a)-1; 9 while(a[i]) 10 { 11 b[i] = a[j]; 12 i++; 13 j--; 14 } 15 b[i] = 0; 16 printf("%s\n",b); 17 18 return 0; 19 }
字符串逆序C++实现:https://blog.csdn.net/qq_44711190/article/details/118956333
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 7 string a = "asdfg"; 8 string b(a.rbegin(),a.rend()); 9 cout << b << endl; 10 11 return 0; 12 }
5.计算一个字节里(byte)里面有多少bit被置1
1 #include <stdio.h> 2 3 int main() 4 { 5 int c = 0xcf,cout = 0,i = 0; 6 while(i<8) 7 { 8 if(c&&1) 9 { 10 cout++; 11 c = c>>1; 12 } 13 i++; 14 } 15 printf("%d\n",cout); 16 17 return 0; 18 }
6.编写函数形式参数为字符数组,对该字符数组存储的字符串中的字符从小到大排序并输出。
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 6 5 6 int main(void) { 7 8 int i,j; 9 char a[] = "asdfgh"; 10 for(i = 0;i<N-1;i++) 11 { 12 for(j = 0;j<N-1-i;j++) 13 { 14 if(a[j]>a[j+1]) 15 { 16 int temp = a[j]; 17 a[j] = a[j+1]; 18 a[j+1] = temp; 19 } 20 } 21 } 22 printf("%s\n",a); 23 24 return 0; 25 }
C++实现:https://blog.csdn.net/qq_23100787/article/details/50475510
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 using namespace std; 5 6 int main() { 7 8 string a = "bcasd"; 9 sort(a.begin(),a.end()); 10 cout << a << endl; 11 12 return 0; 13 }
7.一个字符串和一个单个字符,在字符中删除所有的单个字符
1 #include <stdio.h> 2 3 int main() 4 { 5 char a[] = "asdfga"; 6 char b = 'a'; 7 for(int i = 0;a[i]!='\0';i++) 8 { 9 if(a[i]==b) 10 { 11 for(int j = i;a[j]!='\0';j++) 12 { 13 a[j] = a[j+1]; 14 } 15 } 16 } 17 printf("%s\n",a); 18 19 return 0; 20 }
8.编写函数,函数有两个字符串类型的形参,将在第一个字符串中出现的但在第二个字符串未出现的字符存放在第三个数组中并输出。
例如:第一个字符串是"ABACDEFGH" 第二个字符串是"BCD" 则第三个字符串是"AAEFGH"
1 #include <stdio.h> 2 3 int main() 4 { 5 int i,j,temp,x = 0; 6 char a[] = "ABACDEFGH",b[] = "BCD",c[10]; 7 for(i = 0;a[i]!='\0';i++) 8 { 9 temp = 1; 10 for(j = 0;b[j]!='\0'&&temp;j++) 11 if(a[i] == b[j]) temp = 0; 12 if(temp) 13 { 14 c[x] = a[i]; 15 x++; 16 } 17 } 18 c[x] = 0; 19 printf("%s\n",c); 20 return 0; 21 }
9.对于一个字符串,设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。给定字符串A和它的长度n以及特点位置p,请返回旋转后的结果。
1 #include <stdio.h> 2 3 int main() 4 { 5 char a[] = "asdfgh",b[10]; 6 int n = 3,j = 0,i; 7 for(i = n;a[i]!='\0';i++) 8 { 9 b[j] = a[i]; 10 j++; 11 } 12 for(i = 0;i<n;i++) 13 { 14 b[j] = a[i]; 15 j++; 16 } 17 b[j] = 0; 18 printf("%s\n",b); 19 20 return 0; 21 }
10.strcpy函数的实现
原型:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char a[] = "********"; 7 char b[] = "asdf"; 8 strcpy(a,b); 9 printf("%s\n",a); 10 11 return 0; 12 }
strcpy的底层实现:
1 #include <stdio.h> 2 #include <string.h> 3 4 void Strcpy(char *a,char *b) 5 { 6 while(*b == '\0') 7 { 8 *a = *b; 9 *a++; 10 *b++; 11 } 12 *a = *b; 13 } 14 15 int main() 16 { 17 char a[] = "********"; 18 char b[] = "asdf"; 19 strcpy(a,b); 20 printf("%s\n",a); 21 22 return 0; 23 }
11.strcmp函数的实现
原型:
参数:str1
– 要进行比较的第一个字符串。str2
– 要进行比较的第二个字符串。
返回值:(比较指定的ASCII值) 如果 str1 < str2
。返回值<
0,如果 str2 > str1
。返回值>
0,如果 str1 = str2
,返回值 =
0
1 #include <stdio.h> 2 #include <string.h> 3 5 int main() 6 { 7 char a[] = "asdf"; 8 char b[] = "asdf"; 9 char c[] = "asd"; 10 int i = strcmp(a,b); 11 printf("%d\n",i); 12 13 return 0; 14 }
底层实现:
1 #include <stdio.h> 2 #include <string.h> 3 4 int strcmp(char *a,char *b) 5 { 6 while(*a == *b) 7 { 8 if(*a == '\0') 9 { 10 return 0; 11 } 12 *a++; 13 *b++; 14 } 15 if(*a > *b) 16 { 17 return 1; 18 19 }else if(*a < *b){ 20 21 return -1; 22 } 23 24 return 0; 25 } 26 27 int main() 28 { 29 char a[] = "asdf"; 30 char b[] = "asdf"; 31 char c[] = "asd"; 32 int i = strcmp(a,b); 33 printf("%d\n",i); 34 35 return 0; 36 }
12.strlen函数的实现
原型:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char a[] = "asdfg"; 7 int i = strlen(a); 8 printf("%d\n",i); 9 10 return 0; 11 }
1 #include <stdio.h> 2 3 int Strlen(char *a) 4 { 5 int i = 0; 6 while(*a != '\0') 7 { 8 *a++; 9 i++; 10 } 11 12 return i; 13 } 14 15 int main() 16 { 17 char a[] = "asdfg"; 18 int i = Strlen(a); 19 printf("%d\n",i); 20 21 return 0; 22 }
13.strcat函数的实现
原型:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char a[] = "asdfg"; 7 char b[] = "zxcvb"; 8 strcat(a,b); 9 printf("%s\n",a); 10 11 return 0; 12 }
1 #include <stdio.h> 2 #include <string.h> 3 4 void Strcat(char *a,char *b) 5 { 6 while(*a != '\0') 7 { 8 *a++; 9 } 10 while(*b != '\0') 11 { 12 *a = *b; 13 *a++; 14 *b++; 15 } 16 *a = '\0'; 17 } 18 19 int main() 20 { 21 char a[100] = "asdfg"; 22 char b[] = "zxcvb"; 23 Strcat(a,b); 24 printf("%s\n",a); 25 26 return 0; 27 }
14.字符串替换空格
实现函数,把字符串中的空格替换为"%20"
例如:把字符串"We are like study.“中的空格全都替换为”%20",替换之后字符串就变为了"We%20are%20like%20study."
https://blog.csdn.net/dangzhangjing97/article/details/83956567
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int i = 0,a = 0,b = 0,c = 0; 7 char arr[] = "We are like study"; 8 while(arr[i] != '\0') 9 { 10 if(arr[i] == ' ') 11 { 12 a++; 13 } 14 else 15 { 16 b++; 17 } 18 i++; 19 } 20 c = b + (2 * a); 21 22 while(b>=0) 23 { 24 if(arr[b] == ' ') 25 { 26 arr[c--] = '0'; 27 arr[c--] = '2'; 28 arr[c--] = '%'; 29 } 30 else 31 { 32 arr[c--] = arr[b]; 33 } 34 b--; 35 } 36 printf("%s\n",arr); 37 38 return 0; 39 }
C++实现:
扫描字符串,遇见空格时将空格替换为0,并在该位置前面插入%2。本方法用到了字符串的insert函数。insert函数插入会将其余字符串后移。所以时间复杂度是O(n2)。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class node{ 6 public: 7 string replace(string s){ 8 string str = "%2"; 9 for(int i = 0;i<s.size();i++){ 10 if(s[i] == ' '){ 11 s[i] = '0'; 12 s.insert(i,str); 13 } 14 } 15 return s; 16 } 17 }; 18 19 int main() { 20 21 node n; 22 string s = "We are happy"; 23 cout << n.replace(s) << endl; 24 25 return 0; 26 }
先扫描一遍字符串,记录下有多少个空格,然后对字符串扩容,长度为将空格替换为%20后的长度。然后定义两个指针i,j。i从旧字符串末尾开始左移,j从新字符串末尾开始左移。没有遇见空格,就执行s[j]=s[i];遇见空格将连着的三个位置分别赋予0,2,%。如果j=i了,说明已经没有空格,j前面的字符串不必再赋予,时间复杂度是O(n)。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class node{ 6 public: 7 string replace(string s){ 8 int oldlen = s.size(),cout = 0; 9 for(int i = 0;i<s.size();i++){ 10 if(s[i] == ' ') cout++; 11 } 12 s.resize(s.size()+2*cout); 13 int newlen = s.size(); 14 for(int i = oldlen-1,j = newlen-1;i<j;i--,j--){ 15 if(s[i] != ' ') s[j] = s[i]; 16 else{ 17 s[j] = '0'; 18 s[--j] = '2'; 19 s[--j] = '%'; 20 } 21 } 22 return s; 23 } 24 }; 25 26 int main() { 27 28 node n; 29 string s = "We are happy"; 30 cout << n.replace(s) << endl; 31 32 return 0; 33 }
15.最长公共前缀(力扣14题)
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class node{ 6 public: 7 string longest(vector<string>& strs){ 8 for(int i = 0;i<strs[0].size();i++){ 9 char c = strs[0][i]; 10 for(int j = 1;j<strs.size();j++){ 11 if(i == strs[j].size() || c != strs[j][i]){ 12 return strs[0].substr(0,i); 13 } 14 } 15 } 16 return strs[0]; 17 } 18 }; 19 20 int main() 21 { 22 node n; 23 vector<string>strs; 24 strs.push_back("abcd"); 25 strs.push_back("abc"); 26 strs.push_back("ab"); 27 cout << n.longest(strs) << endl; 28 29 return 0; 30 }
16.最长回文子串(力扣第五题)
1 #include<iostream> 2 using namespace std; 3 4 class node{ 5 public: 6 string longgest(string s){ 7 string ans = ""; 8 for(int i = 0;i<s.size();i++){ 9 int l = i-1,r = i+1; 10 while(l>=0 && r<s.size() && s[l] == s[r]) l--,r++; 11 if(ans.size() < r-l-1) ans = s.substr(l+1,r-l-1); 12 13 int x = i,y = i+1; 14 while(x>=0 && y<s.size() && s[l] == s[r]) x--,y++; 15 if(ans.size() < y-x-1) ans = s.substr(x+1,y-l-1); 16 } 17 return ans; 18 } 19 }; 20 21 int main() 22 { 23 node n; 24 string s = "asdfdsa"; 25 cout << n.longgest(s) << endl; 26 27 return 0; 28 }
17.二进制相加(力扣67题)
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class node{ 6 public: 7 string addbinary(string a,string b){ 8 string ans; 9 int carry = 0; 10 int i = a.size() -1,j = b.size() -1; 11 while(i>=0 || j>=0 || carry){ 12 if(i>=0) carry += a[i--] - '0'; 13 if(j>=0) carry += b[j--] - '0'; 14 ans = to_string(carry%2) + ans; 15 carry /= 2; 16 } 17 return ans; 18 } 19 }; 20 21 int main(){ 22 23 node n; 24 string a = "11"; 25 string b = "11"; 26 string c = n.addbinary(a,b); 27 cout << c << endl; 28 29 return 0; 30 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)