中興的筆試的兩道題目,乙個題目是按頻次排序,乙個題目是動態規劃求揹包問題。
題目描述
題意為從乙個無序陣列中,將其中的整數按照出現的頻次多少來排列(並且出現幾次就排列幾個),按照出現頻次從高倒低排序,並且頻次相同的時候做乙個穩定排序,先出現的排在前面,比如輸入為[1,2,1,2,9,9,1,6,4,4,4,4,7],那麼輸出就應該為[4,4,4,4,1,1,1,2,2,9,9,6,7]。
#思路最開始想的是使用兩個vector,乙個用來儲存頻次,乙個用來儲存元素,例如題目描述中的這個陣列就會被儲存為times=,num=,然後再將兩者按照times的大小進行排序,因為要求是穩定的,所以採用乙個穩定排序演算法,我用的是插入排序,然後最後再按照排序之後的結果來得出對應輸出就可以了。
#code
#include#include#include#includeusing namespace std;
vectorsalaryfrequeny(int num, int * salaries)
vectortimes;
vectornums;
mapsuoyin;//也可以直接在num裡面尋找,但是我覺得map是以rb_tree為底層的,尋找會快一點。
int index = 0;
for (int i = 0; i < num; i++)
else
}int len = nums.size();
for (int i = 1;i0&×[j]>times[j-1]; --j)
}for (int i = 0; i < len; i++)
res.insert(res.end(), times[i], nums[i]);
return res;
}int main()
;vectorresult = salaryfrequeny(num, salaries);
int len = result.size();
for (int i = 0; i < len; i++)
cout << result[i] << " ";
system("pause");
return 0;
}
執行結果如下所示:
題目描述
維克多博士創造了乙個裂變反應堆,可取用處於液體狀態的放射性物質。反應堆的容量是v加侖。他有n瓶的放射性液體,每個都有一定的質量和一定的體積。當液體倒入反應堆時,也產生一些單位的能量。現在,維克多想要將能量輸出最大化。但是,有乙個限制條件。他研究了原子元素的物理知識和歷史,認識到反應堆內放射性液體的總量不能超過特定的臨界質量m,否則反應就會失控,並引發劇烈的**。寫乙個演算法,幫助他從反應堆獲得最大的能量,而不會讓他丟掉性命。
輸入:該函式/方法的輸入包括六個引數------
reactorcap,乙個整數,表示反應堆的容量(v);
numberofradliquid,乙個整數,表示現有小瓶的數量(n);
criticalmass,乙個整數,表示反應堆的最大臨界質量(m);
volumes,乙個整數列表,按順序表示n份放射性液體的體積;
masses,乙個整數列表,按順序表示n份放射性液體的質量;
energies,乙個整數列表,按順序表示n份放射性液體產生的能量。
輸出:返回乙個整數,表示可給定的約束條件下從反應堆中產生的最大能量。
示例:輸入:
reactorcap=100,numberofradliquid=5,criticalmass=15,volumes=[50,40,30,20,10],masses=[1,2,3,9,5],energies=[300,480,270,200,180]
輸出:960
解釋:選擇1、2、5號瓶中的液體,產生的能量=300+480+180=960.
#思路在筆試的時候,因為趕浦發的筆試,時間太緊了,直接用的暴力破解,列出所有可能的組合,然後判斷是否滿足約束條件,再輸出滿足約束條件裡面的最大能量,慢的一匹,下來仔細想了想,這就是揹包問題的嘛,利用動態規劃解決這道題時,使用乙個函式f來表示最大能量,方程為f(v,m,n), 這個方程的解表示n個小瓶在約束條件最大質量m,最大容量v下可以獲得的最大能量,那麼很顯然f(v,m,n)=max(f(v,m,n),f(v,m,n-1),f(v-v(k),m-m(k),n)),利用乙個二維陣列表示在某個體積和質量的約束下可獲得的最大能量,詳細理解可以看下面的**注釋,以及輸出結果。
#code
#include #include #include #include using namespace std;
int maxenergy(int reactorcap, int numofliq, int maxmass, vectorvolumes, vectormass, vectorenergies)
}for(int i=0;i>reactorcap;
int numberofradliquid ;
cout<
cin>>numberofradliquid;
int maxmass ;
cout<
cin>>maxmass;
vectorvol;
vectormass;
vectorener;
for(int i=0;i>temp;
vol.push_back(temp);
}for(int i=0;i>temp;
mass.push_back(temp);
}for(int i=0;i>temp;
ener.push_back(temp);
}int res = maxenergy(reactorcap, numberofradliquid, maxmass, vol, mass, ener);
cout<
執行結果如下所示:
兩道筆試題
昨天一朋友找工作,碰到兩道演算法筆試題,都是當於鍊錶操作的.原題具體的還原不過來了,不過大致是 1.有一單鏈表,找出最後第m個節點.昨天看到問題時,想到了小學應用題 汽車過山洞,假如這個汽車開著開著,等到車頭剛要出山洞,車尾離山洞出口也有一段距離嘛.這樣,這個題方法出來了 cpp node find...
兩道簡單的題目
第一次發表文章,就發表兩到簡單點的題目好了 第一道題目是這樣的 現在有乙個整數的陣列,然後給定乙個目標數,我們要做的是找出陣列中唯一存在的兩個不同的數,其相加能夠得到這個目標數,然後返回這兩個數的下標比如 given nums 2,7,11,15 target 9,because nums 0 nu...
C 兩道筆試題
現給定乙個含有n個元素的陣列,請隨機獲取其中的m個元素 不能重複獲取 include include using namespace std void grial int a,int n,int x for i 0 i k i int main grial a,sizeof a sizeof int...