題解:求兩個數。第乙個是和提示串和原串相同的有多少個。另乙個是原串中有的但是位置不同的有多少個。要注意如如果位置相同已經計算過了,那麼不同的計數時原串的這個位置就不能計算來。其實只要用乙個陣列來統計每個數字被取用過幾次,只要還有剩下,就可以取用,次數+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 會對面試幫助很大。雖然來來回回看了好些遍左程雲那個初級演算法課程,但是有的地方還是記不牢,準備面試的時間大部分還是花在了閱...