C語言-演算法-字串
阿新 • • 發佈:2018-11-08
字串操作
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> //字串移位包含問題,比如AABCD前兩位AA移到尾部後BCDAA包含CDAA字串; bool contain_check() { char s[10] = "AABCD"; char d[5] = "CDAA"; int len = strlen(s); int i=0; for(i=0; i<len; ++i) { char temp = s[0]; int j=0; for(j=0; j<len-1; ++j) s[j] = s[j+1]; s[len-1] = temp; if(strstr(s,d) != 0) { printf("check OK,s=%s <- d=%s\n",s,d); return true; } } printf("check NO,s=%s !~ d=%s\n",s,d); return false; } //求一個字串中出現頻率最高的那個字元及其出現次數 void get_most(char *s, char &ch, int &size) { ch = '\0'; size = 0; if (NULL != s) { int n[256]; memset(n, 0, sizeof(n)); while(*s != '\0') { n[*s+128] += 1; if((n[*s+128]) > size) { size = n[*s+128]; ch = *s; } s++; } } } void exe_get_most() { char p[]="aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char ch; int size; get_most(p, ch,size); printf("%c,%d\n", ch,size); } //給一個字串,有大小寫字母,要求寫一個函式把小寫字母放在前面,大寫字母放在後面,儘量使用最小的空間、時間複雜度。 void move_char(char* a) { char* i = a; char* j = a+strlen(a)-1; while(i < j) { while(*i && (*i>='a' && *i<='z')) ++i; if((*i) == '\0') break; while(*j>='A' && *j<='Z') --j; if(i < j) { char c = *i; *i = *j; *j = c; } ++i; --j; } } void exe_move_char() { char p[]="AeBCDabcd"; move_char(p); printf("%s\n", p); } //求1,2...n的無重複且無序的陣列排序,時間複雜度O(n),空間複雜度O(L),一次只能交換兩個數。 void FunSort1ton() { int a[]={10,6,9,5,2,8,4,7,1,3}; int len=sizeof(a)/sizeof(int); int tmp; int i; for(i=0;i<len;) { tmp=a[a[i]-1]; a[a[i]-1]=a[i]; a[i]=tmp; if(a[i] == i+1) i++; } for(i=0;i<len;i++) printf("%d ", a[i]); printf("\n"); } void FunStrInvert(char *str)//字串倒序,不使用額外空間,如abcd為dcba。 { int len=strlen(str); char tmp; int i; for(i=0;i<len/2;i++) { tmp=str[i]; str[i]=str[len-i-1]; str[len-i-1]=tmp; } } void FunStrInvert_Exe() { char str[]="abcd"; FunStrInvert(str); printf("%s\n", str); } int main() { FunStrInvert_Exe(); return 0; }