数组以及字符串经典题-创新互联

1.数组中只有一个数字只出现一次,其他都成对出现

10年积累的成都网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有句容免费网站建设让你可以放心的选择与我们合作。

如:int a[] = {2,3,5,6,4,3,2,5,6};   打印出4。

 首先呢,先分析此题。

 可将数组的第一个元素与后边其他元素进行异或,(异或的性质:任何一个数字异或自己都为0)若为0,则将这个元素删除。

 如:数组第一个元素为2,当碰到后边那个2时,将后边元素删除。a[] = {2,3,5,6,4,3,5,6}。

 然后比较数组第二个,以此类推。

 当我们在数组前面找到这个这个只出现一次的元素,即可return。因为题目给出的是只有一个数字只出现一次呢。

int FindOneNum(int* a,int size)
{
	int i = 0;
    for(int j=i+1;j

//测试函数

void Test()
{
	int a[] = {4,2,3,5,6,3,2,5,6};
	//int a[] = {2,3,5,6,4,3,2,5,6};
	//int a[] = {2,3,5,6,3,2,5,6,4};
	int size = sizeof(a)/sizeof(a[0]);
	int ret = FindOneNum(a,size);
	cout<

//测试结果

数组以及字符串经典题

2.数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

分析:

  数组若为无序,则先将数组排序。

  数组中有一个元素的次数超过数组长度的一半,也就是说它的出现次数比其他数字之和还要多。

因此我们在遍历数组时,应该保存两个值:一个是数字,一个是次数。当我们遍历到下一个数字时,若与我们之前保存的数字相同,则次数加1,不同次数减1。若次数为0,则需要保存下一个数字,并将次数置为1。那么我们要找的可能就是最后一次将次数置为1的数字。

bool CheckArray(int* a,int size)//检查数组是否合法
{
	if(a == NULL || size <= 0)
		return false;
	return true;
}
void Sort(int* a,int size)//数组排序
{
	if(CheckArray(a,size))
	{
		int i = 0;
		int j = 0;
		for(i=0;i a[j+1])
				{
					int tmp = a[j];
					a[j] = a[j+1];
					a[j+1] = tmp;
				}
			}
		}
	}
	return;
}
bool MornThanHalf(int* a,int size,int num)//是否超过一半
{
	int count = 0;
	for(int i=0;i= size)
	{
		return true;
	}
	return false;
}
int MoreThan(int* a,int size)//次数较多的数
{
	if(!CheckArray(a,size))
		return 0;
	int num = a[0];
	int count = 1;
	for(int i=1;i

//测试函数

void Test()
{
	int a[] = {3,2,3,3,2,3,4,3,4,2,3,3};
	int size = sizeof(a)/sizeof(a[0]);
	Sort(a,size);
	int ret = MoreThan(a,size);
	cout<

//测试结果

数组以及字符串经典题

3.实现一个函数,可以右旋字符串中的k个字符。(可以左旋字符串中的k个字符)

 ABCDE右旋一个字符得到BCDEA

 ABCDE右旋两个字符得到CDEAB

 ABCDE左旋一个字符得到EABCD

 ABCDE左旋两个字符得到DEABC

void move(char* left,char* right)
{
	while(left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char p[] = {"ABCDE"};
	int size = strlen(p);
	int n = 0;
	cin>>n;              //n=3
	//右旋n为
	//move(p,p+n-1);       //CBADE
	//move(p+n,p+size-1);  //CBAED
	//move(p,p+size-1);    //DEABC
	//cout<

第3题扩展:判断一个字符串是否为另外一个字符串旋转之后的字符串。

bool CheckEquel(char* p,char* q,int size)
{
	char* tmp = new char[size+1];
	for(int n=0;n

测试结果:

数组以及字符串经典题

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享标题:数组以及字符串经典题-创新互联
文章位置:http://pwwzsj.com/article/dgcecs.html