!鄭重提示!!!!!!!:
正在學編程、算法的同學請千萬不要依賴此插件,否則你可能甚至無法手寫出一個for循環
AI幫我寫代碼?我幫AI寫代碼?庄周夢蝶?蝶夢庄周?十分夢幻。
copilot在VScode和IDEA上都有,我們先在VScode上演示一下,然后告訴大家如何安裝使用。
今天早上突然收到郵件通知我獲得了使用copilot預覽版的權限,是的,使用這個插件需要申請,不過流程很快,待會細說,先來看看效果(這個插件直接下巴都給我震碎了)
Copilot效果演示:
那我們使用這個插件來實現一下求兩個字符串的最長公共子串長度試一下:
我僅僅寫了一個函數名。。。就已經給我寫完了?但是我想換一種寫法,看看他能提供什么樣的幫助:
-
首先,若兩個字符串有一個為null,那么直接返回0:
我剛敲了個if.... -
若兩字符串不為null,但有一個長度為0,則返回0:
-
設置一個boolean數組dp,dp[i][j]: str1[i]==str2[j],設置一個maxStart表示最長公共子串的起始下標,maxLen表示最長公共子串的長度:
彩蛋:它好像懂了我的代碼想要干什么。。並且嘗試幫我生成注釋:
-
那好吧,我們依據copilot讀懂得我的思路,來寫一個for循環:
這次我們試試寫注釋,讓它幫我直接生成代碼:
for循環里面的業務應該是寫錯了,因為dp不需要通過遞推實現。
我們自己實現一下,通過另外一個變量k,來尋找最長的斜線:
真厲害。。稍加提示立馬就知道我要干什么。。。這確實是我設想的實現代碼。。
- 最后返回值
如果是只要求最長長度的話,直接return maxLen即可,而如果是要求最長子串,那么。。
我服了。。它太懂我了
但是應該還是需要更正優化一下,在while循環中,應當加上
&&!dp[i + k][j + k]!
這個條件,否則在遍歷時會重復判斷重復累加k。
代碼放這了,因為這個代碼跟我之前自己寫得簡直一模一樣,我就不測試了,大家如果有疑問可以拿去測試一下
點擊查看代碼
public String longestCommonSubstring(String str1, String str2){
if(str1==null||str2==null) return null;
int n=str1.length();
int m=str2.length();
if(n==0||m==0) return null;
boolean [][] dp=new boolean[n][m];
int maxStart=0, maxLen=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int k=0;
while(i+k<m&&j+k<n&&str1.charAt(j+k)==str2.charAt(i+k)&&!dp[i + k][j + k]){
dp[j][i]=true;
k++;
}
if(k>maxLen){
maxLen=k;
maxStart=i;
}
}
}
return str2.substring(maxStart, maxStart+maxLen);
}
更新
它居然在幫我生成測試用例:
Copilot的安裝使用:以VScode為例
首先在插件商店中安裝這個插件,然后它會要求你登錄github,按照要求登錄即可,之后它會告訴你沒有權限使用copilot,因此需要去申請,申請完之后會進入wait list,大概等個兩三天之后,就會收到郵件,就可以愉快地手撕代碼了
這里是官方getting start文檔:
https://github.com/github/copilot-docs/blob/main/docs/visualstudiocode/gettingstarted.md#getting-started-with-github-copilot-in-visual-studio-code