15道簡單演算法題

2021-07-16 02:25:07 字數 4308 閱讀 5495

出處:

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 通過兩個棧...