2016 07 09完成 8 道題

2021-07-14 16:18:15 字數 4465 閱讀 8761

題解:求兩個數。第乙個是和提示串和原串相同的有多少個。另乙個是原串中有的但是位置不同的有多少個。要注意如如果位置相同已經計算過了,那麼不同的計數時原串的這個位置就不能計算來。其實只要用乙個陣列來統計每個數字被取用過幾次,只要還有剩下,就可以取用,次數+1。

#include 

#include

#include

using

namespace

std;

int n,s[1010],g[1010],x,y,t[20],z[20];

int main ()

while (true)

}for (int i = 1; i <= n; i++)

if (s[i]!=g[i])

}if (g[1]==0)break;

cout

<<" ("

<","

<")"

}}

題意:給你美女的國家和她的名字,要你統計每個國家有幾個美女。按字典序輸出國家和個數。

解體思路:寫乙個struct包含國家和姓名。以國家為關鍵字進行排序。迴圈掃一遍統計個數並輸出。

#include 

#include

#include

#include

using

namespace

std;

struct node s[3000];

int n;

bool cmp(const node a,const node b)

int main ()

sort(s+1,s+1+n,cmp);

int sum=1;

for (int i = 1; i <= n; i++)

if (s[i].country != s[i+1].country) else sum++;

}

題意:給n個數和m個詢問。求每次詢問的數在n個數排序後的可以在第幾位找到。

解題思路:對n個數進行排序,然後傻瓜迴圈找位置。

#include 

#include

#include

#include

using

namespace

std;

int n,m,s[12000];

bool cmp(int a, int b)

if (tag != -1)

printf("%d found at %d\n",c,tag);

else

printf("%d not found\n",c);}}

}

題意:給定若干個三維點,以0 0 0結束。求每個點和它最近的那個點的距離。並統計距離在0~1,1~2……9~10(前閉後開)這些區間內的個數。

解題思路:暴力解決 。

#include 

#include

#include

#include

#include

using

namespace

std;

int sum[12],x[5100],y[5100],z[5100];

int dis(int i, int j)

int main ()

n--;

for (int i = 1; i <= n; i++)

if (mindis < 10)

sum[mindis] ++ ;

}for (int i = 0; i <= 9; i++)

printf("%4d",sum[i]);

printf("\n");

}

題意:每次只能交換相鄰兩個的順序,求最小交換次數使得序列從小到大。

解題思路:每次只能交換相鄰兩個,我們不難想到氣泡排序。其實這就是求用氣泡排序所要進行多少次交換。

#include 

#include

#include

#include

using

namespace

std;

int n,s[70],t;

int main ()

cout

<" swaps."

《題意:給乙個堆,每次用鏟子能把插入位置上面的倒置。求如何操作能讓整個堆從上到下的大小時從小到大。

解題思路:首先我們可以想到,如果想把某個位置上的數字弄到我們想要的地方,只需要把它先倒置到頂部,在從要它去的地方插入再倒置一次,就可以來。那麼我們可以想一下我們肯定要從底部著手,從下往上一塊一塊解決。

那麼我們就需要知道正確的順序 ——通過另開乙個陣列進行排序可以知道順序

我們每次要操作哪塊? ——不在正確位置上編號最大的那塊

移動到**?—— 正確位置上

其實寫道這裡我發現我**上寫了一段很多餘的操作。。。

#include

#include

#include

#include

using

namespace

std;

bool cmp(int a, int b)

for (int i = 1; i <= n; i++)

printf("%d ",s[i]);

printf("\n");

sort(z+1,z+1+n,cmp);

int tag=1;

s[0]=-1;z[0]=-2;

while ( tag )

tag=n;

while (s[tag] == z[tag]) tag--;

if (tag) printf("%d ",n-tag+1);

for (int i = 1; i <= tag/2 ;i++)

}printf("0\n");

}}

題意:給定若干個單詞,#表示輸入結束。求在無視大小寫的情況下,無論經過如何排序都不會和其他單詞相同的那些單詞。按字典序從小到大輸出。

解題思路:寫個struct包含s1和s2,s2是對s1進行全部轉換成小寫並按字典序從小到大排序的字串。以s2作為關鍵字進行排序。在排序完的序列中只要但前位置的s2與它前後的s2不相同,這個便是乙個滿足條件的單詞。用另乙個字串數字存下。再按字典序排序,輸出。

#include 

#include

#include

#include

using

namespace

std;

struct node s[2000];

string ans[2000];

int n=0,la=0;

bool cmp1(const node a,const node b)

bool cmp2(const

string a,const

string b)

}n--;

sort(s+1,s+1+n,cmp1);

for (int i = 1; i <= n; i++)

if (s[i].s2 != s[i+1].s2 && s[i].s2 != s[i-1].s2)

sort(ans+1,ans+1+la,cmp2);

for (int i = 1; i <= la; i++)

cout

《題意:給定n和n個字串,對n個字串按字典序從小到大排序,按列優先順序並以左對齊的方式輸出,每個單詞場寬為最長串長度+2,並且每行不超過60字元長度。

解題思路:這題是個大坑。

先進行排序,簡單。

要計算能排幾行幾列。

列數 = (n-maxlength) / (maxlength+2)+1;

行數 = (n-1)/列數 +1;

然後就是愉快的輸出控制了。坑。

#include

#include

#include

#include

using

namespace

std;

string s[300];

int n,maxlen,an,am;

bool cmp(const

string a,const

string b)

sort(s+1,s+1+n,cmp);

// (maxlen+2)*am + maxlen = 60

am = (60-maxlen) / (maxlen +2) +1;

an = (n-1) / am +1;

for (int i = 1; i <= 60; i++)

printf("-");

printf("\n");

maxlen+=2;

for (int i = 1; i <= an; i++)

printf("\n");}}

}

借助桶排序思想完成的一道題

問題 陣列排序之後的相鄰數的最大差值 嗯,你可以排序,然後找相鄰的最大差值。但是你覺得這麼簡單我寫他幹啥。最優解 時間複雜度o n 空間o 1 那我們開始說這種方法 1 遍歷所有數,找到最小值和最大值 min和max 2 設陣列長度為n,我們準備n 1個桶 3 把max放進最後乙個桶裡,min放到第...

道可道,非常道 8個做事之「理」

道可道,非常道 8個做事之 理 66begin 如果說 真的要從楊萃先書 找點反覆品味的地方,我想這必然是其中之一。凡是累了,請做減法。常說。在學業上是這樣的。但是在做人上,我還得輕快的做加法。很多不懂。66end 為人之道,做事之理,需要長時間的領悟與實踐才能掌握。僅據筆者的拙見,在大學期間,最重...

100 道演算法題

左程雲在牛客網上發帖子說過建議 80 備戰面試的時間放在資料結構和演算法上,剩下的 20 的時間再放在基礎知識上。cyc2018 在小專欄裡也說過 100 道 leetcode 會對面試幫助很大。雖然來來回回看了好些遍左程雲那個初級演算法課程,但是有的地方還是記不牢,準備面試的時間大部分還是花在了閱...