15道使用頻率極高的基礎演算法題

2021-09-27 17:51:20 字數 4102 閱讀 6472

15道常見的基礎演算法題:

1、合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素;2、合併兩個已經排序的單鏈表;3、倒序列印乙個單鏈表;4、給定乙個單鏈表的頭指標和乙個指定節點的指標,在o(1)時間刪除該節點;5、找到鍊錶倒數第k個節點;6、反轉單鏈表;7、通過兩個棧實現乙個佇列;8、二分查詢;9、快速排序;10、獲得乙個int型的數中二進位制中的個數;11、輸入乙個陣列,實現乙個函式,讓所有奇數都在偶數前面;12、判斷乙個字串是否是另乙個字串的子串;13、把乙個int型陣列中的數字拼成乙個串,這個串代表的數字最小;14、輸入一顆二叉樹,輸出它的映象(每個節點的左右子節點交換位置);15、輸入兩個鍊錶,找到它們第乙個公共節點;

**實現:

1、合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素;合併排序一般的思路都是建立乙個更大陣列c,剛好容納兩個陣列的元素,先是乙個while迴圈比較,將其中乙個陣列a比較完成,將另乙個陣列b中所有的 小於前乙個陣列a的數及a中所有的數按順序存入c中,再將a中剩下的數存入c中,但這裡是已經有乙個陣列能存下兩個陣列的全部元素,就不用在建立陣列了, 但只能從後往前面存,從前往後存,要移動元素很麻煩。

//合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素
void mergearray(int a,int alen,int b,int blen) else } while (alen>=0) while (blen>=0) } void mergearraytest() ; int b=; mergearray(a,5,b,5); for (int i=0;i
//鍊錶節點
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); }

4、給定乙個單鏈表的頭指標和乙個指定節點的指標,在o(1)時間刪除該節點;刪除節點的核心還是將這個節點的下乙個節點,代替當前節點。

//給定乙個單鏈表的頭指標和乙個指定節點的指標,在o(1)時間刪除該節點
void deletenode(nodel* head,nodel* delnode) if (delnode->next!=null)//刪除中間節點 else if (head==delnode)//刪除頭結點 else//刪除尾節點,考慮到delnode不在head所在的鍊錶上的情況 if (tmpnode!=null) } } void deletenodetest() if (i==k) } deletenode(head,delnode) ; } }

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<
//通過兩個棧實現乙個佇列
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]
//獲得乙個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 (soulen
//把乙個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() { nodel* head1=new nodel(0); nodel* head2=new nodel(0); nodel* node1=new nodel(1); nodel* node2=new nodel(2); nodel* node3=new nodel(3); nodel* node4=new nodel(4); nodel* node5=new nodel(5); nodel* node6=new nodel(6); nodel* node7=new nodel(7); head1->next=node1; node1->next=node2; node2->next=node3; node3->next=node6;//兩個鍊錶相交於節點node6 head2->next=node4; node4->next=node5; node5->next=node6;//兩個鍊錶相交於節點node6 node6->next=node7; nodel* node= findfirstequalnode(head1,head2); if (node) { cout
15道使用頻率極高的基礎演算法題

ifndef algorithm h define algorithm h include 1 合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素 2 合併兩個單鏈表 3 倒序列印乙個單鏈表 4 給定乙個單鏈表的頭指標和乙個指定節點的指標,在o 1 時間刪除該節點 5...

15道簡單演算法題

出處 1 合併排序,將兩個已經排序的陣列合併成乙個陣列,其中乙個陣列能容下兩個陣列的所有元素 2 合併兩個單鏈表 3 倒序列印乙個單鏈表 4 給定乙個單鏈表的頭指標和乙個指定節點的指標,在o 1 時間刪除該節點 5 找到鍊錶倒數第k個節點 6 反轉單鏈表 7 通過兩個棧實現乙個佇列 8 二分查詢 9...

2道階乘的演算法題

衝著51nod新ui去做了題,順便總結一下,這裡有2道階乘的題,1003 階乘後面0的數量 n的階乘後面有多少個0?6的階乘 1 2 3 4 5 6 720,720後面有1個0。input 乙個數n 1 n 10 9 output 輸出0的數量input示例 5output示例 1 看到這題第一反應...