極客時(shí)間《左耳聽風(fēng)》發(fā)起的ARTS挑戰(zhàn)怎么參加?
左耳朵耗子專欄《左耳聽風(fēng)》 用戶自發(fā)每周完成一個(gè)ARTS
非常抱歉,上周因?yàn)槭虑楸容^多赃磨,一直在加班,沒來及做寞埠,爭(zhēng)取補(bǔ)上
感謝耗子叔上次指出的問題
1.Algorithm:每周至少做一個(gè) leetcode 的算法題
第一道算法題:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
3.無重復(fù)字符的最長(zhǎng)子串
自己看完題后的思路:
第一種,將所有的子串找出驳规,然后篩選出無重復(fù)字符的斥赋,然后再對(duì)比長(zhǎng)度
第二種,
字符串:ABCDECDEFGIF
A
AB
ABC
ABCD
ABCDE
ABCDEC => ABCDE DEC maxLength = 5;
DECD => DEC ECD maxLength = 5;
ECDE => ECD CDE maxLength = 5;
CDEF
CDEFG
CDEFGI
CDEFGIF =>CDEFGI GIF maxLength = 6;
最開始的代碼:
public int lengthOfLongestSubstring(String s) {
if(s.length()<=1){
return s.length();
}
int maxLength = 0;
Set<Character> set = new LinkedHashSet();
Set<Character> tmpSet;
int length = s.length();
Boolean isEqual;
for (int index =0 ;index<length;index++) {
char c = s.charAt(index);
if(!set.add(c)){
maxLength = Math.max(maxLength,set.size());
tmpSet = new LinkedHashSet();
isEqual = false;
for(char ch : set ){
if(ch==c){
isEqual = true;
continue;
}
if(isEqual){
tmpSet.add(ch);
}
}
tmpSet.add(c);
set = tmpSet;
}
}
maxLength = Math.max(maxLength,set.size());
return maxLength;
}
再細(xì)想一下氛琢,可以采用滑動(dòng)窗口的方式:
/**
* 滑動(dòng)窗口方式:
* [leftIndex,rightIndex]
* 開始leftIndex不動(dòng)喊递,rightIndex往右移動(dòng),并將值添加到set中阳似。
* 如果添加成功骚勘,次數(shù)計(jì)算 Math.max(maxLength,rightIndex-leftIndex),(注意:此時(shí)的rightIndex已經(jīng)++)撮奏。
* 如果添加失敗调鲸,說明已經(jīng)存在,從leftIndex開始移除挽荡,直到添加再次成功,說明set重復(fù)值之前的數(shù)據(jù)已經(jīng)全部刪除即供。
*/
public int lengthOfLongestSubstring1(String s) {
int maxLength = 0;
Set<Character> set = new HashSet();
int length = s.length();
for (int leftIndex = 0, rightIndex = 0 ;rightIndex< length && leftIndex<length;){//此處可以換成while
if(set.add(s.charAt(rightIndex))){
rightIndex++;
maxLength = Math.max(maxLength,rightIndex-leftIndex);
}else{
set.remove(s.charAt(leftIndex++));
}
}
return maxLength;
}
第二道算法題:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
4.尋找兩個(gè)有序數(shù)組的中位數(shù)
思路:將兩個(gè)數(shù)組合并排序定拟,到一半結(jié)束
問題:時(shí)間復(fù)雜度不是題目要求的 O(log(m + n))
/**
* 支持 ,兩個(gè)都是正序逗嫡,兩個(gè)都是倒序青自,或者一個(gè)正序一個(gè)倒序
* @param nums1
* @param nums2
* @return
*/
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double result= 0d;
if(nums1==null){
nums1 = new int[]{};
}
if(nums2==null){
nums2 = new int[]{};
}
if(nums1.length==0 && nums2.length==0){ // 處理兩個(gè)都是0的情況
return result;
}
// 奇數(shù)/偶數(shù) 是否是奇數(shù)
boolean isOdd = (nums1.length+nums2.length)%2 !=0;
int medianIndex1 = isOdd ? (nums1.length+nums2.length)/2 : (nums1.length+nums2.length)/2 -1;
int medianIndex2 = isOdd ? -1 : (nums1.length+nums2.length)/2;
int[] nums3 = new int[isOdd ? medianIndex1+1 :medianIndex2+1];
// 倒序,正序驱证?延窜?
boolean nums1Asc = true;
boolean nums2Asc = true;
for(int i=0 ;i<nums1.length-1;i++){
if(nums1[i]!=nums1[i+1]){
nums1Asc = nums1[i] < nums1[i+1];
break;
}
}
for(int i=0 ;i<nums2.length-1;i++){
if(nums2[i]!=nums2[i+1]){
nums2Asc = nums2[i] < nums2[i+1];
break;
}
}
int i = nums1Asc ? 0 : nums1.length-1;
int j = nums2Asc ? 0 : nums2.length-1;;
int index =0;
while ((nums1Asc ? i<nums1.length : i>=0) || (nums2Asc ? j<nums2.length : j>=0)){
if((nums1Asc ? i<nums1.length : i>=0) && (nums2Asc ? j<nums2.length : j>=0)){
if(nums1[i]<nums2[j]){
nums3[index] = nums1[i];
i = nums1Asc ? i+1 : i-1;
}else{
nums3[index] = nums2[j];
j = nums2Asc ? j+1 : j-1;
}
}else if(nums1Asc ? i<nums1.length : i>0){
nums3[index] = nums1[i];
i = nums1Asc ? i+1 : i-1;
}else if(nums2Asc ? j<nums2.length : j>0){
nums3[index] = nums2[j];
j = nums2Asc ? j+1 : j-1;
}
if(isOdd ){
if(index == medianIndex1){
break;
}
}else{
if(index == medianIndex2){
break;
}
}
index++;
}
if(isOdd ){
result = (double)nums3[nums3.length-1];
}else{
result = ((double)nums3[nums3.length-1]+(double)nums3[nums3.length-2])/2;
}
return result;
}
2.Review:閱讀并點(diǎn)評(píng)至少一篇英文技術(shù)文章
How to think like a programmer?—?lessons in problem solving
如何像程序員一樣思考問題-解決問題的經(jīng)驗(yàn)教訓(xùn)
從本質(zhì)上講, 這是解決問題的一種更有效的方法
一般解決問題的方式:
- 嘗試一個(gè)方案
- 如果方案不成功抹锄,嘗試另一個(gè)方案
- 如果還不起作用逆瑞,重復(fù)步驟2,直到解決
運(yùn)氣好可以解決伙单,運(yùn)氣不好获高,可能浪費(fèi)很多時(shí)間也沒有解決
推薦的方法:
- 首先得有一個(gè)框架
- 多實(shí)踐
Almost all employers prioritize problem-solving skills first.
Problem-solving skills are almost unanimously the most important qualification that employers look for….more than programming languages proficiency, debugging, and system design.
幾乎所有雇主都首先優(yōu)先考慮解決問題的技能。
解決問題的技能幾乎是雇主尋求的最重要的資格...不僅僅是編程語言的熟練程度吻育,調(diào)試和系統(tǒng)設(shè)計(jì)
一念秧、框架
作者建議:"The 4-Hour Chef"
“The biggest mistake I see new programmers make is focusing on learning syntax instead of learning how to solve problems.”?—?V. Anton Spraul
我看到新程序員犯下的最大錯(cuò)誤就是專注于學(xué)習(xí)語法,而不是學(xué)習(xí)如何解決問題布疼。
遇到新問題時(shí)應(yīng)該怎么做摊趾?
- 理解
首先你的理解問題币狠,才能很好的解決問題。
怎么算理解呢砾层?引用一下:
“If you can’t explain something in simple terms, you don’t understand it.”?—?Richard Feynman
如果你不能用簡(jiǎn)短的文字描述一件事情漩绵,那么不算理解它。
- 制定計(jì)劃
處理問題是一定要花時(shí)間先去理解問題梢为,分析問題渐行,然后制定執(zhí)行計(jì)劃。有了計(jì)劃再去執(zhí)行铸董。
- 拆解問題
不要試圖去一下解決一個(gè)大問題祟印。
應(yīng)該將大問題拆解成一個(gè)個(gè)的小問題,甚至可以把小問題繼續(xù)拆解粟害。
然后蕴忆,從解決拆解后的小問題開始處理。
當(dāng)所有小問題解決后悲幅,把小問題串聯(lián)起來套鹅,大問題自然就解決了。
將問題減少到知道如何解決問題并編寫解決方案的程度汰具。
二卓鹿、堅(jiān)持了嗎?
解決小問題試留荔,遇到問題吟孙,卡住了,怎么辦聚蝶?
- 調(diào)試
- 重新評(píng)估杰妓,是不是換另一中思路(有時(shí)我們會(huì)在問題的細(xì)節(jié)上迷失方向,而忽略了在更一般的層面上解決問題的一般原則)
- 研究碘勉,比如巷挥,谷歌等
三、實(shí)踐
不要期望短時(shí)間內(nèi)就會(huì)有一個(gè)很好的改變验靡。
如果你想成為一個(gè)好的問題解決者倍宾,你需要不斷的去解決問題。
當(dāng)然晴叨,解決的問題有很多:國際象棋謎題凿宾,數(shù)學(xué)問題,數(shù)獨(dú)兼蕊,圍棋初厚,大富翁,視頻游戲,密碼等等
事實(shí)上产禾,成功人士的共同模式是他們練習(xí)“解決微觀問題”的習(xí)慣排作。
3.Tip:學(xué)習(xí)至少一個(gè)技術(shù)技巧
uptime
11:07 up 5 days, 19:58, 5 users, load averages: 2.90 2.96 2.76
顯示內(nèi)容說明:
11:07 # 系統(tǒng)當(dāng)前時(shí)間
up 5 days, 19:58 # 系統(tǒng)已運(yùn)行時(shí)間
5 users # 登錄用戶數(shù)
load averages: 2.90 2.96 2.76 # 系統(tǒng)平均負(fù)載,統(tǒng)計(jì)最近1亚情,5妄痪,15分鐘的系統(tǒng)平均負(fù)載
平均負(fù)載:是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)下和不可中斷狀態(tài)的平均進(jìn)程數(shù)楞件,也就是平均活躍進(jìn)程數(shù)衫生,它和CPU使用率沒有直接關(guān)系。
4.Share:分享一篇有觀點(diǎn)和思考的技術(shù)文章
創(chuàng)業(yè)公司需要基礎(chǔ)架構(gòu)團(tuán)隊(duì)嗎土浸?
個(gè)人剛經(jīng)歷的一個(gè)創(chuàng)業(yè)公司罪针,公司成立已經(jīng)快一年了,有一個(gè)后臺(tái)的統(tǒng)計(jì)程序黄伊,所有邏輯全部用sql寫到了controller中泪酱。
因?yàn)橹皼]經(jīng)歷過創(chuàng)業(yè)公司,所以不清楚這樣做是不是對(duì)还最。
歡迎同學(xué)給建議墓阀。