-第五周。这两周在复习大学里的课程,发现当时觉得课上很多看不懂的,现在看起来轻松多了,也带来了新的感悟。
1.Algorithm:每周至少做一个 leetcode 的算法题
2.Review:阅读并点评至少一篇英文技术文章
3.Tip:学习至少一个技术技巧
4.Share:分享一篇有观点和思考的技术文章
以下是各项的情况:
Algorithm
链接:[LeetCode-14]-Longest Common Prefix
题型都有大概的套路的
- 非空判断
- 数组里面只有一个元素的判断
- 其它情况的判断
所以先判空,再想其他问题
思路:
1. 找出minString
2. 排除特殊情况:
1)字符串数组为空,返回 null
2)字符串数组长度为1,直接返回 strs[0]
3)字符串数组中存在空字符串 返回 null
4)数组中存在一个单词的首字母与其他单词的首字母不同,返回 null
3. 双层for循环找出 最长公共前缀
4. 注意,在内层for循环比较之前,可以再排除一种情况:如果strs[i] 与 minString 值相同,则不执行内层循环。以减少代码运行时间。
class Solution { public String longestCommonPrefix(String[] strs) { // 1. 判空 2.查找Str中最短长短,做判断边界 3.返回相同的公共头部 if (strs.length == 0) return ""; if (strs.length == 1) return strs[0]; // 最短长先暂设第一个 int min = strs[0].length() ; // 判断最短长 for(String s : strs) { min = Math.min(min, s.length()); } // 先暂定数组第一个是最短的 String minstr = strs[0]; // 先判断头是否相等,都不等排除 节省时间 // 再使用 for(int i=0;i <= strs.length ;i++ ) { if(strs[0].charAt(0) != strs[i].charAt(0)) { return ""; } /*if (strs[i].length() < min) { minstr = strs[i]; }*/ } for (int i = 0; i < strs.length; i++) { if (minstr.equals(strs[i])) { continue; } for (int j = min-1; j > 0 ; j--) { if (minstr.charAt(j) != strs[i].charAt(j)) { minstr = minstr.substring(0, j); } } } return minstr; } } public class MainClass { public static String[] stringToStringArray(String line) { JsonArray jsonArray = JsonArray.readFrom(line); String[] arr = new String[jsonArray.size()]; for (int i = 0; i < arr.length; i++) { arr[i] = jsonArray.get(i).asString(); } return arr; } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = in.readLine()) != null) { String[] strs = stringToStringArray(line); String ret = new Solution().longestCommonPrefix(strs); String out = (ret); System.out.print(out); } } }
submit后提示出现 :
java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at line 658, java.lang.String.charAt at line 73, Solution.longestCommonPrefix at line 163, MainClass.main
怎么出现了越界问题 ? 这可怎么搞 。。感觉除了写的繁琐了点,没看出问题。 在 tips 里是否能独立解决掉
Review
git 提交 信息要避免的问题
这篇不错,把不需要的点列出来,主旨就是开发人员 git commit信息不要写的过多过杂 ,省的其他人产生混乱 。觉得很有用
Tip
https://coderanch.com/t/658095/java/Correct-java-lang-StringIndexOutOfBoundsException-String
索引号小于长度的问题,那么我原先的代码有什么问题呢 ? 我暂时还得再想想 ,我先这样修改就能提交了
class Solution { public String longestCommonPrefix(String[] strs) { if (strs.length == 0) { return ""; } if (strs.length == 1) { return strs[0]; } String min = strs[0] ; for (int i = 0; i < strs.length; i++) { if (strs[i].isEmpty()) { return ""; } if (strs[0].charAt(0) != strs[i].charAt(0)) { return ""; } if (strs[i].length() <= min.length()) { min = strs[i]; } } for (int i = 0; i < strs.length; i++) { if (min.equals(strs[i])) { continue; } for (int j = min.length()-1; j > 0 ; j--) { if (min.charAt(j) != strs[i].charAt(j)) { min = min.substring(0, j); } } } return min; } }
Share
https://www.javaworld.com/article/3341388/jdk-13-the-new-features-coming-to-java-13.html
JDK13 的新功能 :
增强 ZGC(Z垃圾收集器) 以将未使用的内存返回到操作系统,引用的提议被集成到JDK 13中.ZGC被称为可扩展的低延迟收集器,目前不会将未使用的内存返回到操作系统即使长时间没有使用内存。对于某些应用程序和环境而言,此行为并非最佳,尤其是那些需要关注内存占用的应用程序和环境,例如应用程序可能长时间处于空闲状态并与其他应用程序共享或竞争资源的容器或环境 。。。 ,不过好像没有重大规则更改?
switch 更灵活了 , 将switch表达式看作一种多路条件运算符(?:
) 应该是这个意思 ??
https://www.javaworld.com/article/2941281/java-101-deciding-and-iterating-with-java-statements.html?page=1