힘의 단추--두 수의 합
4001 단어 LeetCode
두 수의 합. 나는 단추 위의 간단한 문제에서 쉽게 풀었다.이 문제의 난이도로 말하자면, 단독으로 블로그를 써서 이 문제를 기록할 필요가 없다.그런데 오늘 제가 이 문제를 풀고 나니 2년 전, 1년 전 한 달 전에 이 문제를 풀었더라고요. 그때 제가 쓴 코드가 어땠는지 궁금해요. 2년 동안 코드 능력이 늘었나요?이런 마음으로 나는 2년 전, 1년 전의 문제풀이를 눌렀다. 2년 전에 나는 이 문제의 문제를 풀었다. class Solution { public: string addBinary(string a, string b) { string rslt =""; bool over_flow = false; int i,j; for(i = a.size()-1,j = b.size()-1;i>=0&&j>=0;--i,--j){ if(!over_flow){ if(a[i]=='1'&&b[j] == '1'){ rslt.insert(rslt.begin(),'0'); over_flow=true; } else rslt.insert(rslt.begin(),max(a[i],b[j])); } else{ if(a[i]=='0'&&b[j] == '0'){ rslt.insert(rslt.begin(),'1'); over_flow=false; } else{ rslt.insert(rslt.begin(),min(a[i],b[j])); over_flow=true; } } } if(i>=0||j>=0){ string tmp(""); if(i>=0) tmp.assign(a.begin(),a.begin()+i+1); else tmp.assign(b.begin(),b.begin()+j+1); if(!over_flow) rslt = tmp+rslt; else{ int j; for(j = tmp.size()-1;j>=0;--j){ if(tmp[j]=='1') tmp[j] = '0'; else if(tmp[j]=='0') { tmp[j] = '1'; break; } } rslt= string(j>=0?"":"1") + tmp + rslt; } } else if(over_flow) rslt = "1"+rslt; return rslt; } }; 10개월 전에 나는 이 문제를 다음과 같이 풀었다. class Solution { public: string addBinary(string a, string b) { char up = '0'; if(a.size()<b.size()) a = string(b.size()-a.size(), '0')+a; else if(b.size() < a.size()) b = string(a.size()-b.size(), '0')+b; string ans(a.size(), '0'); int i = a.size()-1; int j = b.size()-1; while(i>=0 && j >=0){ if(a[i] =='0'&& b[j] == '0') { ans[i] = up; up = '0'; } else if(a[i] == '0'&& b[j] == '1' || a[i] == '1'&& b[j]=='0'){ if(up == '0') ans[i] = '1'; else{ ans[i] = '0'; up = '1'; } } else{ if(up == '0'){ up = '1'; ans[i] = '0'; } else{ up = '1'; ans[i] = '1'; } } i--; j--; } if(up == '1') ans.insert(ans.begin(), up); return ans; } }; 오늘 나의 문제는 다음과 같다. class Solution { public: string addBinary(string a, string b) { int i = a.size()-1; int j = b.size()-1; string& ans = a.size()>b.size() ? a: b; int remain = 0; // 진위수 int sum = remain; // 같은 위치에 덧붙인 합 while(i>=0 || j>=0 || remain){ sum = remain; sum += (i>=0) ? (a[i] - '0'): 0; sum += (j>=0) ? (b[j] - '0'): 0; remain = sum/2; sum = sum%2; if(i>=0 || j>=0) ans[max(i, j)] = sum + '0'; else ans.insert(ans.begin(), sum +'0'); i--; j--; } return ans; } }; 세 가지 문제를 비교해 보면 좋은 코드가 무엇인지, 썩은 코드가 무엇인지 한눈에 알아볼 수 있다. 2년 전에 나는 간단한 문제를 쓰는 데 어려움을 겪었고 주석이 없어서 코드를 읽기가 매우 어려워졌다.오늘날에 와서 이 문제를 가볍게 해결할 수 있고 간단명료한 주석도 추가할 수 있다. 이것은 확실히 내가 프로그래밍 방면에 큰 발전을 했다는 것을 설명한다. 나는 자신도 모르게 양적 변화가 질적 변화를 일으킨다고 감개무량하게 느낀다. 얼마 전에 제가 LeetCode에서 처음 문제를 풀었을 때 간단한 문제를 풀었을 때 저는 3시간 동안 풀었을 수도 있고 심지어 오후 내내 헷갈렸을 수도 있습니다. IDE의 도움으로 버그를 조금만 찾았는데 마지막에 악취가 나고 긴 제출 코드로 통과했습니다.비록 통과했지만 내 마음은 여전히 매우 괴롭다. 왜 분명히 간단한 등급의 문제인데 나는 이렇게 힘들게 하는가, 나는 왜 이렇게 형편없는가? 알고리즘이 이렇게 중요한데 나는 늘 깨닫지 못한다. 다른 사람에게 매우 간단한 알고리즘 문제인데 나는 반나절의 힘을 들여야만 디버깅을 할 수 있다. 중간 난이도의 문제는 더욱 상상할 수 없고 그야말로 하늘에 오르는 것과 같다.나는 마침내 결론을 얻었다. 나는 너무 멍청해서 다른 방법이 없어서 필사적으로 연습할 수밖에 없었다. 그래서 2018년 6월부터 나는 알고리즘 문제를 단속적으로 꾸준히 연습했고 2019년부터 한동안 중단했다. 2019년 8월부터 나는 다시 계속 연습하기 시작했다. 나는 매일 적어도 두 문제를 풀기로 결정했다. 그때 나는 아직 약했다. 나는 모든 간단한 문제를 먼저 풀기로 결정했다.윽박지르는 학우들은 왜 내가 매일 간단한 문제를 칠하는지 이상하다. 이런 것들은 무의미하고 시간을 낭비하는 것이라고 생각한다.그들은 옳다. 간단한 문제는 확실히 그들에게 큰 의미가 없지만 나에게는 큰 의미가 있다. 나는 매일 2~3문제를 풀고 매일 아주 작게 발전하고 감지할 수 없을 정도로 작을 수도 있다. 때때로 나도 이것이 도대체 쓸모가 있는지 의심할 때가 있다.그럼에도 불구하고 나는 여전히 포기하지 않았다. 지금까지 나는 이전에 문제를 풀었던 기록을 보았고 마침내 내가 많이 진보했다는 것을 알게 되었다. 매일의 노력은 비록 매우 작지만, 모두 견지하기만 하면, 오랜 세월의 연습을 거치면 매우 큰 진보를 얻을 수 있다.거대한 성공을 분할하고, 마지막으로 도착한 것은 매일 눈에 띄지 않는 노력이다!자신의 노력을 쉽게 포기하지 마라. 진보를 느끼지 못했다고 진취적인 마음을 포기하지 마라. 오랜 세월의 축적을 거쳐 모든 노력이 결국 성공의 바다로 모일 것이다! 삼가 이 글로 자신을 격려하고 문제를 푸는 것을 견지하며 진보를 견지하며 진취를 견지합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.