亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數組以及字符串經典題

發布時間:2020-07-29 04:52:22 來源:網絡 閱讀:490 作者:下一個明天 欄目:編程語言

1.數組中只有一個數字只出現一次,其他都成對出現

如: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<size-i;j++)
	{
		if(i<size)
		{
			if(((a[i])^(a[j])) == 0)
			{	
				for(int k=j;k<size-i;k++)
				{
					a[k] = a[k+1];
				}
				i++;
				j = i;
				continue;
			}
			if(((a[i])^(a[j])) != 0 && j == size-i-1)
			{
				return a[i];
			}	
		}
	}
	return a[i];
}

//測試函數

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<<ret<<endl;
	return 0;
}

//測試結果

數組以及字符串經典題


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<size-1;i++)
		{
			for(j=0;j<size-i-1;j++)
			{
				if(a[j] > 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;i++)
	{
		if(a[i] == num)
		{
			count++;
		}
	}
	if(count*2 >= 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<size;i++)
	{
	    if(num == a[i])//數字相同
	    {
		count++;
	    }
	    else
	    {
		count--;
            }
	    if(count == 0)
	    {
		num = a[i];
		count = 1;
	     }
	}
	if(MornThanHalf(a,size,num))
	{
		return num;
	}
	return 0;
}

//測試函數

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<<ret<<endl;
}

//測試結果

數組以及字符串經典題



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<<p<<endl;

	//左旋n位
	move(p+n,p+size-1);   //ABEDC
	move(p,p+n-1);        //BAEDC
	move(p,p+size-1);     //CDEAB
	cout<<p<<endl;
}


第3題擴展:判斷一個字符串是否為另外一個字符串旋轉之后的字符串。


bool CheckEquel(char* p,char* q,int size)
{
	char* tmp = new char[size+1];
	for(int n=0;n<size;n++) //最多可旋轉size個字符
	{
		strcpy(tmp,p);    //每次進出都必須將p的內容復制給tmp
		move(tmp,tmp+n-1); //調用move函數,旋轉n個字符
		move(tmp+n,tmp+size-1);
		move(tmp,tmp+size-1);
		if(strcmp(tmp,q) == 0) //旋轉后的字符串與q相等
		{
			return true;	
		}
	}
	return false;
}
int main()
{
	char p[] = {"ABCDE"};
	char q[] = {"CDEAB"};
	int size = strlen(p);
	bool ret = CheckEquel(p,q,size);
	if(ret == true)
	{
		cout<<"字符串是由旋轉得來的"<<endl;
	}
	else
	{
		cout<<"字符串不是由旋轉得來的"<<endl;
	}
	return 0;
}

測試結果:

數組以及字符串經典題

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绍兴县| 吴堡县| 桐乡市| 沙洋县| 永泰县| 乐清市| 平武县| 寻乌县| 彩票| 水富县| 紫金县| 宜阳县| 沈阳市| 渝中区| 潜江市| 威远县| 江口县| 乌兰浩特市| 九寨沟县| 蛟河市| 台中市| 新源县| 清涧县| 大余县| 温宿县| 扶绥县| 太谷县| 濉溪县| 津南区| 双柏县| 曲阳县| 滨州市| 二手房| 浏阳市| 体育| 都匀市| 民和| 萍乡市| 安国市| 余庆县| 宜兰县|