1.數(shù)組中只有一個數(shù)字只出現(xiàn)一次,其他都成對出現(xiàn)
站在用戶的角度思考問題,與客戶深入溝通,找到昌寧網(wǎng)站設(shè)計與昌寧網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋昌寧地區(qū)。
如:int a[] = {2,3,5,6,4,3,2,5,6}; 打印出4。
首先呢,先分析此題。
可將數(shù)組的第一個元素與后邊其他元素進行異或,(異或的性質(zhì):任何一個數(shù)字異或自己都為0)若為0,則將這個元素刪除。
如:數(shù)組第一個元素為2,當碰到后邊那個2時,將后邊元素刪除。a[] = {2,3,5,6,4,3,5,6}。
然后比較數(shù)組第二個,以此類推。
當我們在數(shù)組前面找到這個這個只出現(xiàn)一次的元素,即可return。因為題目給出的是只有一個數(shù)字只出現(xiàn)一次呢。
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]; }
//測試函數(shù)
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; }
//測試結(jié)果
2.數(shù)組中有一個數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個數(shù)字。
分析:
數(shù)組若為無序,則先將數(shù)組排序。
數(shù)組中有一個元素的次數(shù)超過數(shù)組長度的一半,也就是說它的出現(xiàn)次數(shù)比其他數(shù)字之和還要多。
因此我們在遍歷數(shù)組時,應(yīng)該保存兩個值:一個是數(shù)字,一個是次數(shù)。當我們遍歷到下一個數(shù)字時,若與我們之前保存的數(shù)字相同,則次數(shù)加1,不同次數(shù)減1。若次數(shù)為0,則需要保存下一個數(shù)字,并將次數(shù)置為1。那么我們要找的可能就是最后一次將次數(shù)置為1的數(shù)字。
bool CheckArray(int* a,int size)//檢查數(shù)組是否合法 { if(a == NULL || size <= 0) return false; return true; } void Sort(int* a,int size)//數(shù)組排序 { 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)//次數(shù)較多的數(shù) { if(!CheckArray(a,size)) return 0; int num = a[0]; int count = 1; for(int i=1;i<size;i++) { if(num == a[i])//數(shù)字相同 { count++; } else { count--; } if(count == 0) { num = a[i]; count = 1; } } if(MornThanHalf(a,size,num)) { return num; } return 0; }
//測試函數(shù)
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; }
//測試結(jié)果
3.實現(xiàn)一個函數(shù),可以右旋字符串中的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題擴展:判斷一個字符串是否為另外一個字符串旋轉(zhuǎn)之后的字符串。
bool CheckEquel(char* p,char* q,int size) { char* tmp = new char[size+1]; for(int n=0;n<size;n++) //最多可旋轉(zhuǎn)size個字符 { strcpy(tmp,p); //每次進出都必須將p的內(nèi)容復(fù)制給tmp move(tmp,tmp+n-1); //調(diào)用move函數(shù),旋轉(zhuǎn)n個字符 move(tmp+n,tmp+size-1); move(tmp,tmp+size-1); if(strcmp(tmp,q) == 0) //旋轉(zhuǎn)后的字符串與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<<"字符串是由旋轉(zhuǎn)得來的"<<endl; } else { cout<<"字符串不是由旋轉(zhuǎn)得來的"<<endl; } return 0; }
測試結(jié)果:
網(wǎng)站欄目:數(shù)組以及字符串經(jīng)典題
文章源于:http://aaarwkj.com/article38/iijppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、品牌網(wǎng)站設(shè)計、關(guān)鍵詞優(yōu)化、域名注冊、品牌網(wǎng)站建設(shè)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)