500. Keyboard Row

来源:互联网 发布:vb sum函数 编辑:程序博客网 时间:2024/06/06 02:15

问题描述:给你一串字,判断这些字能否用美式键盘布局上同一行的字母打出来。
思路:写上52行的case when进行判断,想想都觉得美妙,所以直接看答案了。
最佳答案:

    public String[] findWords(String[] words) {        String s1 = "qwertyuiop";        String s2 = "asdfghjkl";        String s3 = "zxcvbnm";        int[] map = new int[26];        for (int i = 0; i < s1.length(); i++) {            map[s1.charAt(i) - 'a'] = 0;        }        for (int i = 0; i < s2.length(); i++) {            map[s2.charAt(i) - 'a'] = 1;        }        for (int i = 0; i < s3.length(); i++) {            map[s3.charAt(i) - 'a'] = 2;        }        ArrayList<String> res = new ArrayList<String>();        for (String w : words) {            if (w.length() == 0) continue;            String s = w.toLowerCase();            int row = map[s.charAt(0) - 'a'];            boolean valid = true;            for (int i = 1; i < s.length(); i++) {                if (map[s.charAt(i) - 'a'] != row) {                    valid = false;                    break;                }            }            if (valid) res.add(w);        }        return res.toArray(new String[res.size()]);    }

可以不用那么多的case when 直接使用map的哈希值快速取数。
另一个不错的答案如下:

public String[] findWords(String[] words) {        String keyboardRegex = "[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*";        return Stream.of(words)            .filter(word -> word.toLowerCase().matches(keyboardRegex))            .toArray(String[]::new);    }

很简洁,一开始完全看不懂。用到了jdk1.8中的lamda表达式,1.6版本的编程思想都还没看完。知识库又要更新了。

原创粉丝点击