c06,c07 数组,指针练习题

数组,指针练习题

1.大小端判断

bool IsBig()
{
	int a = 0x12345678;
	char *p = (char *)&a;
	if(*p == 0x78) 
	{
		return false;//小端
	}
	else
	{
		return true;//大端
	}

}
bool IsBig()//方法二
{
	int a = 0x12345678;
	char *p = (char *)&a;
	if(*p == 0x78) 
	{
		return false;//小端
	}
	else
	{
		return true;//大端
	}

}

小端转化为大端

unsigned int  Fun(unsigned int n)//小端变大端
{
	return ( ((n&0xff000000) >>24) | ((n&0x00ff0000) >>8)
	| ((n&0x0000ff00) <<8) | ((n&0x000000ff) <<24) );
}

2.“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--;
	}
}

3.“Here is Tulun”====>“Tulun is Here”

char * RevreSentence(char *str)//逆置句子
{
	assert (str!=NULL);
	char* pbegin=str;
	char* pend=str;
	while(*pend!='\0')
	{
		pend++;
	}
	pend--;//pend指向末尾字母
	Reverse(pbegin, pend);//逆置整个句子
	pbegin=str;
    pend=str;

	while (*pbegin!='\0')
	{
		if (*pbegin==' ')
		{
			pbegin++;
			pend ++;
		}
		else if(*pend==' '||*pend=='\0')
		{
			Reverse(pbegin,--pend);	
			pbegin=++pend;//pb指向空格,pbegin++ ,pend++
		}
		else
		{
			pend++;
		}
	}
	return str;
}

4.回文字符串的判断

//abcba   回文字符串123321   判断是否为  
bool IsPalindrome(const char* str)
{
	assert(str!=NULL);//DEBUG
	if(str == NULL || strlen(str) <= 0)//release
	{
		return false;
	}
	const char* pbegin=str;
	const char* pend=str+strlen(str)-1;
	while(pend>pbegin)//没有相遇
	{
		if(*pbegin==*pend)
		{
			pend--;
			pbegin++;
		return true;
		}
		else 
		{
			
			return false;
			//printf("这不是一个回文串");不能写,不会执行return后的语句
		}
	}
	return true;
}

5.二分查找,折半查找

int Binarserach(int *arr,int len,int key)
{
	int low=0;
	int high =len-1;
	while(low<=high)
	{
		int mid=(low+high)>>1;//移位比除法快
		if (arr[mid]==key)
		{
			return mid;
		}
		else if(arr[mid]>key)
		{
			high=mid-1;
		}
		else
		{
			low=mid+1;
		}
	}	
	return -1;
}

6. My_strlen函数

int My_strlen(char *src)
{
	int len = 0;
	while(*src++ != '\0')//'0'  '\0'   0    0x00
	{
		len++;
		//src = src+1;
		//src++;
	}
	return len;
}

7.My_strcpy4函数

char * My_strcpy4(char *dest,const char *src)
{
	//char *p = dest;
	assert(dest != NULL && src != NULL);
	while(*dest++ = *src++) {}
	return dest;//走到最后\0
	//return p;
}

8. int 指针 float 和零值如何比较

1、
int 指针 float 和零值如何比较
int ==
int a,b;
if(a>b)//a-b>0
if(ab)//a-b=0
if(a<b)//a-b<0
float
float a=0.0
if((a>=-EPSINON)&&(a<=EPSINO));//EPSINO是定义好的精度如果一个数落在【-0.0-EPSINO,0.0+EPSINO】之间,与0相等,否则不等。
if(a-EPSINON<0&&a+EPSINON>0)//a
0;
两个数的比较
if(a-b<EPSINON)//a=b
if(a-bEPSINON)//a!=b

指针=====>
int *p=NULL;
if(NULL==p);
if(NULL!=0);

bool====>bool b=FALSE;
if(b); if(!b);

9.“ABC DE F” 求单词的个数

void NumberOfSentence( char* str)
{
	assert(str!=NULL);
	int count=0;
	char* pbegin=str;
	char* pend=str;
	while(*pbegin!='\0')
	{
		
		if (*pbegin==' ')
		{
			pbegin++;
			pend ++;
		}
		else if(*pend==' '||*pend=='\0')
		{
			count=count++;
			pbegin= ++pend;
		}
		else
		{
			pend++;
		}
		
	}
	printf("%d\n",count);
	//return str;
}

10.打印一个数组中的奇数

int Fun(int *arr,int len)
{
	int j = 0;//放奇数的下标
	for(int i = 0;i < len;i++) 
	{
		if(arr[i] % 2 != 0) //奇数
		{
			arr[j] = arr[i];
			j++;
		}
	}
	//Show(arr,j);
	return j;
}
void Show(int *arr,int len)
{
	for(int i = 0;i < len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}

11.只出现一次的字符

char *FirstNotrepeate1(char *str)
{
	int arr[256]={0};//字符的大小不会超过256,所以设置一个256大小的数组
	char *tmp=str;
	while(*str!='\0')
	{
		arr[*str]++;//把字符的ASCII码值作为数组下标
		str++;
	}
	str=tmp;
	while(*str!='\0')
	{
		if(arr[*str] == 1)//找到字符出现一次的字符
		{
			return str;	
		}
		str++;
	}
	

char firstNotRepeate(char* str) 
{
	assert(str != NULL);
	const int SIZE = 256;
	int hashTable[SIZE] = {};
	char *phash = str;
	while(*phash != '\0')
	{
		hashTable[*(phash++)]++;
		/*hashTable[*phash]++;
		phash++;*/
	}
	phash = str;
	while(*phash != '\0')
	{
		if(hashTable[*phash] == 1)
		{
			return *phash;
		}
		phash++;
	}
	return '\0';
}

12.左旋数组

//左旋数组
void Reverse(char *begin,char *end)
{
	char tmp;
	while(begin < end)
	{
		tmp = *begin;
		*begin = *end;
		*end = tmp;
		begin++;
		end--;
	}
}
char *Left_Arry(char *str,int num)
{
	assert(str != NULL && num > 0);
	int len = strlen(str);
	if(len > 0 && num < len)
	{
		char *firstbegin = str;
		char *firstend = firstbegin+num-1;
		char *secondbegin = firstend+1;
		char *secondend = str+len-1;
		Reverse(firstbegin,firstend);
		Reverse(secondbegin,secondend);
		Reverse(firstbegin,secondend);
	}
	return str;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值