Java培訓(xùn)Java與自學(xué)Java的差距
培訓(xùn)Java與自學(xué)Java的差距
我以前也是自學(xué)Java,在一家公司跟著別人學(xué),以前是別人眼中的菜鳥,現(xiàn)
在是別人眼中的大神,Java很簡單的,貴在堅(jiān)持和多練,沒必要花那培訓(xùn)錢。如果真的要去學(xué)的話,
選擇Java培訓(xùn)機(jī)構(gòu)要注意這兩點(diǎn)基本上就能避免一些坑:
1. 老師沒有正經(jīng)公司工作經(jīng)歷,或者沒有已經(jīng)在線上正常運(yùn)轉(zhuǎn)的產(chǎn)品。一
些所謂培訓(xùn)班的老師水平往往比較一般,甚至還有培訓(xùn)出來后又接著培訓(xùn)別人的。
2、是不是會(huì)承諾幫你找到工作,要找到好的工作,不是靠別人給你保證的
,還是要靠自己提升能力。
建議多自己學(xué)習(xí)加上找些好的代碼主動(dòng)學(xué)習(xí)。例如github,多練習(xí)網(wǎng)上很多
網(wǎng)站里真正好的代碼。作為Java工程師,可以多看看spring文檔,看看很多已經(jīng)成熟的框架,深入去體會(huì)。另外,學(xué)軟件等等**好還是自己多學(xué),找點(diǎn)
視頻教程之類,也省點(diǎn)錢。
Java基礎(chǔ)語法
Java基礎(chǔ)語法
流程控制語句
Java 編譯器執(zhí)行流程
if 分支結(jié)構(gòu)
switch 選擇結(jié)構(gòu)與相關(guān)規(guī)則
循環(huán)結(jié)構(gòu)
for 循環(huán)
while 循環(huán)
do-while 循環(huán)語句
各語句性能對(duì)比與應(yīng)用場景
特殊流程控制語句
方法的聲明與使用
方法調(diào)用的過程分析
跨類調(diào)用方法
參數(shù)的值傳遞
方法的重載 Overload
Leetcode 179. Largest Number
>
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
s思路:
1. 正如我所理解。需要排序。例如:[3, 30, 34, 5, 9],先把所有數(shù)變成string,然后排序:從左邊起逐位比較,如果相等,則都移動(dòng)到右邊一位比較,這都很平常。有趣的一點(diǎn)是,3和30比較,第0位同為3,相等,但是3只有一位不能再往右移動(dòng)了,此時(shí)就不移動(dòng),而只移動(dòng)30的指針到0,比較3和0。也就是說移動(dòng)受到邊界的限制,只是這里處理邊界的方法是停留在邊界處,并取邊界值比較。再比如:3和34,那3就會(huì)和4比較,發(fā)現(xiàn)4>3,所以34比3大,因?yàn)?4如果放在3前面組成343比34放在3后面組成的334大。(刪除的部分不正確)
2. debug了好久,重新來說。有很多case,例如:3和34比較,可以認(rèn)為3這個(gè)數(shù)停在這個(gè)位置上了,但是這么特殊的一個(gè)例子,3只有一位,怎么看的出來規(guī)律呢,所以問題是被簡化了,顯然自己沒看到更general的case。例如,824和8247,當(dāng)824的指針移動(dòng)到4時(shí),下一刻應(yīng)該去向何處?應(yīng)該把8247的7和824的8比較才對(duì)呀,我馬上結(jié)論說那就是到了結(jié)尾后下一步就再取開頭的數(shù)比較。再例如,323和3233比較,當(dāng)走到323結(jié)尾的3時(shí),下一刻如果回到開頭的3,那么3233也是3,難道這兩個(gè)數(shù)怎么放都可以嗎?顯然323 3233<3233 323,所以還是不對(duì),不過結(jié)合上一次的教訓(xùn),應(yīng)該不用急著全盤否定這種做法,可能我們離正確的做法又近了!既然323遍歷到**右邊數(shù)之后還要回到**左邊數(shù)繼續(xù)比較,那么3233也可以啊,當(dāng)我們3233到了**右邊的3,下一步不是跳出循環(huán),而是繼續(xù)回到**左邊數(shù),所以:3233的**個(gè)數(shù)3和323的第二個(gè)數(shù)2比較,這不,馬上就可以看出大?。〉竭@里,自然想到,如果是333和3333比較,結(jié)果肯定是相等,所以兩個(gè)數(shù)循環(huán)多少次都不可能不相等,因此必須又一個(gè)stopping rule,那就是**長的數(shù)的長度的兩倍(后來又進(jìn)一步縮小范圍,stopping條件是循環(huán)次數(shù)是兩個(gè)數(shù)的長度之和)即:3333循環(huán)兩次還是相等,那就真的相等,這時(shí)候就需要跳出while。
3. 這里思維的進(jìn)步,需要單獨(dú)提一下。昨天 Leetcode 165. Compare Version Numbers的時(shí)候,就把比較放在while內(nèi)和while外到處都是,一點(diǎn)沒打包嚴(yán)實(shí),不光思路不清,debug也不易,**后把比較功能都想辦法塞進(jìn)while內(nèi),世界一下美好了!今天剛開始也出現(xiàn)過,沒多想就把比較不等的放在while內(nèi),比較相等的又放在while外。不過昨天的記錄,今天腦子馬上就冒出一個(gè)聲音說要想辦法把兩部分的代碼都塞進(jìn)while里面,果然就簡單很多,而且**后beat 96%.
4. 補(bǔ)充一點(diǎn),題做多了,和以前僵硬的思路比,現(xiàn)在思維更靈活了,思維的訓(xùn)練和肌肉的訓(xùn)練很相似,或者說這兩者本就沒什么差別,尤其是自己嘗試每天去捕捉思維的形狀。越是去觀察思維的樣子,思維反倒容易放松,也就越容易reshape,而那些批評(píng)自我羨慕別人并不能讓自己思維變化,反而徒增煩惱。就拿這道題說,剛開始有很大一部分是連蒙帶猜的,想到兩個(gè)指針到結(jié)尾時(shí)仍相等怎么辦時(shí),就思維幾乎停在這個(gè)問題,沒有自然而然或努力嘗試去深入思考這個(gè)問題,而是找了兩個(gè)特殊的簡單的例子觀察得出一個(gè)簡化的方法,沒有搞清楚為什么。整個(gè)思維過程就是這樣子,后來debug把復(fù)雜的case拿出來一研究才發(fā)現(xiàn)兩個(gè)指針應(yīng)該循環(huán)往復(fù),問題一下就有趣了些。
5. 這道題反映的思維的短板在哪兒呢?還要說兩個(gè)指針到尾巴后如何處理的事,自己給自己的選項(xiàng)就是試圖簡化答案,比如就停在尾巴,或回到開頭停下。試圖讓指針停在某一個(gè)具體的位置,本身這個(gè)答案就沒有新意,停在一個(gè)地方,而不動(dòng)起來,說明思維或者自己潛意識(shí)在圖省事,怕麻煩,都不愿意讓指針動(dòng)起來。指針不動(dòng),那腦子當(dāng)然也動(dòng)不了,這就expose思維僵化的一瞬間。當(dāng)然,**后能打破思維的靜態(tài)和慣性,讓指針繼續(xù)循環(huán)動(dòng)起來,說明腦子里本來就有動(dòng)的不僵化的一面,只是被這個(gè)強(qiáng)大的僵化的思維給覆蓋了!
6. 看了網(wǎng)上答案,這個(gè)題還有一個(gè)代碼和理解起來都很容易的做法:如何判斷a和b誰應(yīng)該放在前面的問題?比較a b和b a看誰更大,這個(gè)比較直接用string的比較就可以了,因此**后還是一個(gè)簡潔的數(shù)學(xué)題,不過這個(gè)方法每次都要concatenate兩個(gè)string,比較費(fèi)時(shí)間!
7. 再思考一下,這個(gè)數(shù)學(xué)的方法是怎么想到的?自己想到的方法是深入細(xì)節(jié),挑戰(zhàn)各路extreme case,而且**終也在各路細(xì)節(jié)中摸爬滾打出一條正確的方式—循環(huán)指針,一言以蔽之,自己的方法是bottom-up,希望從底層往上解決問題;而利用數(shù)學(xué)的方法,思考就不是從細(xì)節(jié)入手了,而從系統(tǒng)出發(fā),從頂層設(shè)計(jì)入手,是一種top-down的方法。兩種方法各有優(yōu)勢,不必厚此薄彼。數(shù)學(xué)的方法,是一眼能看到10里的人容易想出來的;從底層入手的,對(duì)抗各路limit case的適合一眼能看到1里的人容易想到了,屬于不同世界的人看世界的角度。也不是說世界不同,是處在世界的位置不同,一眼能看10里,那是因?yàn)閯e人站在數(shù)學(xué)的高度看了,所以眼里就是公式,如何用公式把世界給完美的模擬;一眼看1里,沒有數(shù)學(xué)這棟高樓,就只能泥地里打滾,combat艱難的各路case。多從數(shù)學(xué)的角度出發(fā),尤其是發(fā)現(xiàn)目前腦袋里冒出來的方法要面臨很多瑣碎的extreme case時(shí)!
//方法1:循環(huán)比較大小
class Solution {
public:
string largestNumber(vector<int>& nums) {
vector<string> ss(nums.size());//bug:全零就不用轉(zhuǎn)換了,直接返回0.
string res;
int zero=0;
for(int i=0;i<nums.size();i ){
zero =(nums[i]==0);
ss[i]=to_string(nums[i]);
}
if(zero==nums.size()) return "0";
sort(ss.begin(),ss.end(),[](string&a,string&b){
int n1=a.size(),n2=b.size();
int i=0;
/*while(i<max(n1,n2)){//不正確的編碼
char c1,c2;
if(i<n1) c1=a[i];
//else c1=a[n1-1];//bug1
//else c1=a[0];//bug2
else c1=max(a[0],a[n1-1]);
if(i<n2) c2=b[i];
else c2=max(b[0],b[n2-1]);
if(c1>c2) return true;
if(c1<c2) return false;
i ;
}*/
int n=n1 n2;
while(i<n){
char c1,c2;
c1=a[i%n1];
c2=b[i%n2];;
if(c1>c2) return true;
if(c1<c2) return false;
i ;
}
return true;
});
for(string str:ss){
res =str;
}
return res;
}
};
//方法2:簡潔明了,用數(shù)學(xué)之美成就代碼之美!
class Solution {
public:
string largestNumber(vector<int>& nums) {
vector<string> ss(nums.size());//bug:全零就不用轉(zhuǎn)換了,直接返回0.
string res;
for(int i=0;i<nums.size();i ){
ss[i]=to_string(nums[i]);
}
sort(ss.begin(),ss.end(),[](string&a,string&b){
return a b>b a;
});
for(string str:ss){
res =str;
}
return res[0]== 0 ?"0":res;
}
};
相關(guān)推薦:
蘇州JAVA培訓(xùn) 蘇州JAVA培訓(xùn)班 蘇州JAVA培訓(xùn)機(jī)構(gòu)
體驗(yàn)課預(yù)約試聽
倒計(jì)時(shí)
12:00:00