字符串操作
#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;
}