之前推荐的一个刷题平台:一个好玩的刷题平台,探索了有一小段时间了,来做一下阶段性的记录回顾。
1. 整体的感觉
工欲善其事,必先利其器。这个codewars平台整体对工具的感觉会比leetcode更强烈一些。在做每一题的时候,都会深有体会。比如我用的是java,如果对jdk更熟悉一些,不敢说是一路坦途,至少在目前的阶段,是一片坦途。考验的更多的是自己对于某个语言的熟悉程度。
2. 与leetcode的不同
通过上面第一点已经可以看出,codewars这个平台和leetcode完全是两个方向,但是并不冲突。leetcode重在算法,而codewars重在使用。 单纯的算法可能并不足以让你对一门语言有更加深入的了解,因为实现起来并不需要太多的语言中已经有的原生方法,但是这些方法恰恰在实际使用中会让你事半功倍,受益无穷,这一点,正是codewars可以给予的,允许你尽最大可能使用更多的自带方式解决问题。3. 示例和一些记录
当然,只是大段的文字赘述还是没有什么太深的感受,还是通过几个例子来记录一下,效果更好。
- 题目:判断一个句子是否包含每个英文字母至少一次(a-z),不限大小写
- 解答
通用方式: public class PangramChecker { public boolean check(String sentence){ for (char c = 'a'; c<='z'; c++) if (!sentence.toLowerCase().contains("" + c)) return false; return true; } } 流过滤的解法: class PangramChecker { boolean check(final String sentence) { return sentence.chars() .filter(Character::isLetter) .map(Character::toLowerCase) .distinct() .count() == 26; } }
题目:
示例: 46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51 给定一个正整数 n,写成 abcd...(a, b, c, d... 是数字)和一个正整数 p 我们想要找到一个正整数 k,如果它存在的话,使得 n 的数字之和对 p 的连续幂等于 k * n。 换一种说法: 是否存在整数 k 使得:(a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k
解答:
拿到之后,很容易跟着思路直接拆分开来算,通过除10逐步得到每一位。 但是多使用一下Java的方法就不会如此,反而会快很多: public class DigPow { public static long digPow(int n, int p) { String intString = String.valueOf(n); long sum = 0; for (int i = 0; i < intString.length(); ++i, ++p) sum += Math.pow(Character.getNumericValue(intString.charAt(i)), p); return (sum % n == 0) ? sum / n : -1; } }
- 题目:判断一个字符串是否以另一个字符串结尾
- 解答:
除了挨个比较之外,还有很多辅助方法可用: endWith: public class Kata { public static boolean solution(String str, String ending) { return str.endsWith(ending); } } 长度比较: public class Kata { public static boolean solution(String str, String ending) { return str.length() >= ending.length() ? str.substring(str.length()-ending.length()).equals(ending) : false; } }
最后,大家来各取所需吧,最重要的还是在练习过程中,不要过于拘泥当下,记得从题目中走出来,让思路更灵活一些~