出處:
1:合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素;
2:合併兩個單鏈表;
3:倒序列印乙個單鏈表;
4:給定乙個單鏈表的頭指標和乙個指定節點的指標,在o(1)時間刪除該節點;
5:找到鍊錶倒數第k個節點;
6:反轉單鏈表;
7:通過兩個棧實現乙個佇列;
8:二分查詢;
9:快速排序;
10:獲得乙個int型的數中二進位制中的個數;
11:輸入乙個陣列,實現乙個函式,讓所有奇數都在偶數前面;
12:判斷乙個字串是否是另乙個字串的子串;
13:把乙個int型陣列中的數字拼成乙個串,這個串代表的數字最小;
14:輸入一顆二叉樹,輸出它的映象(每個節點的左右子節點交換位置);
15:輸入兩個鍊錶,找到它們第乙個公共節點;
下面簡單說說思路和**實現。
//鍊錶節點
struct nodel
}; //二叉樹節點
struct nodet
};
1:合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素;
合併排序一般的思路都是建立乙個更大陣列c,剛好容納兩個陣列的元素,先是乙個while迴圈比較,將其中乙個陣列a比較完成,將另乙個陣列b中所有的小於前乙個陣列a的數及a中所有的數按順序存入c中,再將a中剩下的數存入c中,但這裡是已經有乙個陣列能存下兩個陣列的全部元素,就不用在建立陣列了,但只能從後往前面存,從前往後存,要移動元素很麻煩。
//合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素
void mergearray(int a,int alen,int b,int blen)
else
}while (blen>=0)
}void mergearraytest()
; int b=;
mergearray(a,5,b,5);
for (int i=0;i2:合併兩個單鏈表;
合併鍊錶和合併陣列,我用了大致相同的**,就不多少了,那本書用的是遞迴實現。
//鍊錶節點
struct nodel
}; //合併兩個單鏈表
nodel* mergelist(nodel* head1,nodel* head2)
else
nodel* tmpnode=head;
while (head1 && head2)
else
head=head->next;
}if (head1)
if (head2)
return tmpnode;
}void mergelisttest()
nodel* head2=new nodel(2);
cur=head2;
for (int i=4;i<10;i+=2)
nodel* head=mergelist(head1,head2);
while (head)
}
3:倒序列印乙個單鏈表;
遞迴實現,先遞迴在列印就變成倒序列印了,如果先列印在呼叫自己就是順序列印了。
//倒序列印乙個單鏈表
void reverseprintnode(nodel* head)
reverseprintnode(head);
}
5:找到鍊錶倒數第k個節點;
通過兩個指標,兩個指標都指向鍊錶的開始,乙個指標先向前走k個節點,然後再以前向前走,當先走的那個節點到達末尾時,另乙個節點就剛好與末尾節點相差k個節點。
//找到鍊錶倒數第k個節點
nodel* findkthtotail(nodel* head,unsigned int k)
else
}nodel* knode=head;
while (tmpnode!=null)
return knode;
}void findkthtotailtest()
}nodel* knode=findkthtotail(head,k+3) ;
if (knode)
nodel* reversehead=null;
nodel* curnode=head;
nodel* prenode=null;
while (curnode!=null)
return reversehead;
}void reverselisttest()
}cur=reverselist( head);
while (cur)
cout<7:通過兩個棧實現乙個佇列;
直接上**
//通過兩個棧實現乙個佇列
templateclass cqueue
s1.push(val);
}void pop()
s2.pop();
}t& front()
return s2.top();
}int size()
private:
stacks1;
stacks2;
};void cqueuetest()
while (q.size()>0)
else if (a[index]9:快速排序;
//快速排序
void qsort(int a,int low,int high)
int first=low;
int last=high;
int key=a[first];//用字表的第乙個記錄作為樞軸
while(first=key )--last;
a[first]=a[last];//將比第乙個小的移到低端
while(first
10:獲得乙個int型的數中二進位制中的個數;
核心實現就是while (num= num & (num-1)),通過這個數和比它小1的數的二進位制進行&運算,將二進位制中1慢慢的從後往前去掉,直到沒有。
//獲得乙個int型的數中二進位制中1的個數
int find1count(int num)
int count=1;
while (num= num & (num-1))
return count;
}
11:輸入乙個陣列,實現乙個函式,讓所有奇數都在偶數前面;
兩個指標,乙個從前往後,乙個從後往前,前面的指標遇到奇數就往後走,後面的指標遇到偶數就往前走,只要兩個指標沒有相遇,就奇偶交換。
//輸入乙個陣列,實現乙個函式,讓所有奇數都在偶數前面
void recordoddeven(int a,int len)
int soulen=strlen(source);
int sublen=strlen(sub);
if (soulen13:把乙個int型陣列中的數字拼成乙個串,這個串代表的數字最小;
先將數字轉換成字串存在陣列中,在通過qsort排序,在排序用到的比較函式中,將要比較的兩個字串進行組合,如要比較的兩個字串分別是a,b,那麼組合成,a+b,和b+a,在比較a+b和b+a,返回strcmp(a+b, b+a),經過qsort這麼一排序,陣列就變成從小到大的順序了,組成的數自然是最小的。
//把乙個int型陣列中的數字拼成乙個串,是這個串代表的陣列最小
#define maxlen 10
int compare(const void* str1,const void* str2)
void getlinkmin(int a,int len)
};//輸入一顆二叉樹,輸出它的映象(每個節點的左右子節點交換位置)
void treeclass(nodet* root)
void printtree(nodet* root) }
void treeclasstest()
return count;
}nodel* findfirstequalnode(nodel* head1,nodel* head2)
else
for (int i=0;inext;
}while (longnode && shortnode && longnode!=shortnode)
if (longnode)//如果有公共節點,必不為null
return null;
}void findfirstequalnodetest()
else
}
一道簡單的演算法題
題目 統計給定數字中,值為1的二進位制位的數量。如果是陣列呢?int getbitcount unsigned int num return count 第一種想法比較簡單,從最後一位開始,比較是否為1,如果為1,就計數器加一。迴圈次數固定,32次。但是這種方法有乙個地方需要注意,那就形參必須為un...
15道使用頻率極高的基礎演算法題
ifndef algorithm h define algorithm h include 1 合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素 2 合併兩個單鏈表 3 倒序列印乙個單鏈表 4 給定乙個單鏈表的頭指標和乙個指定節點的指標,在o 1 時間刪除該節點 5...
15道使用頻率極高的基礎演算法題
15道常見的基礎演算法題 1 合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素 2 合併兩個已經排序的單鏈表 3 倒序列印乙個單鏈表 4 給定乙個單鏈表的頭指標和乙個指定節點的指標,在o 1 時間刪除該節點 5 找到鍊錶倒數第k個節點 6 反轉單鏈表 7 通過兩個棧...