逆制字符串
如:abcdef==>fedcba
思路:使用两个指针分别指向第一个字符和最后一个字符 然后交换位置向中间位置移动 最后完成
代码如下:
void Reverse(char *pbegin,char *pend)
{
assert(pbegin!=NULL&&pend!=NULL);
char tmp=0;//用来交换 临时存放
while(pbegin<pend)
{
tmp=*pbegin;
*pbegin=*pend;
*pend=tmp;
pbegin++;
*pend--;
}
}
逆制每个单词(进阶)
输入一个字符串 offer is here 要求输出 here is offer
思路:
待一步:可以调用上面的功能函数 先整体逆制为:ereh si reffo
第二步:再逆制每个单词变为 here is offer
其中第二步可继续调用上面的功能函数遇到空格便移动两个指针到下一个单词的首位
实现如下:
void Reverse(char *pbegin,char *pend)//看到指针要断言
{
assert(pbegin!=NULL&&pend!=NULL);
char tmp=0;//用来交换 临时存放
/*int len=strlen(str);
*pbegin=str[0];
*pend=str[len-1];*/
while(pbegin<pend)
{
tmp=*pbegin;
*pbegin=*pend;
*pend=tmp;
pbegin++;
*pend--;
}
}
// here is tulun 先整体逆制 再部分逆制
char *R(char *str)
{
assert(str!=NULL);
char*pbegin=str;
char *pend=str;
while(*pend!='\0')
{
pend++;
}
pend--;//不逆制\0
Reverse(pbegin,pend);
pbegin=str;
pend=str;
while(*pbegin==' ')
{
if(*pbegin==' ')//如果前面有空格,跳过
{
pbegin++;
pend++;
}
else if(*pend==' '||*pend=='\0')
{
Reverse(pbegin,--pend);//pend指到空格之前
pbegin=++pend;
}
else
{
pend++;
}
}
判断回文
判断一个字符串是否为回文
如:abcdcba为回文
思路:首位设置两个指针中间向中间靠拢 一旦两个指针对应的值不相等 则返回false 否则便为回文
bool IsHuiWen(const char *str)
{
assert(str!=NULL);
if(str==NULL||strlen(str)<=0)
{
return false;
}
int len=strlen(str);
const char *pbegin=str;
const char *pend=str;
while(*pend!='\0')
{
pend++;
}
pend--;
while(pbegin<pend)
{
if(*pbegin==*pend)
{
pbegin++;
pend--;
}
else
{
return false;
}
}
return true;
}
二分查找
若能找到则返回mid 不能找到则返回-1;
int Binarserach(int *arr,int len,int key)
{
int low=0;
int high=len-1;
while(low<=high)
{
//int mid=(low+high)/2;
int mid=(low+high)>>1;
if(arr[mid]==high)
{
return mid;
}
else if(arr[mid] > key)
{
high = mid-1;
}
else
{
low = mid+1;
}
}
return -1;
}