1、[709]转换成小写字母

//给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 
//
// 
//
// 示例 1: 
//
// 
//输入:s = "Hello"
//输出:"hello"
// 
//
// 示例 2: 
//
// 
//输入:s = "here"
//输出:"here"
// 
//
// 示例 3: 
//
// 
//输入:s = "LOVELY"
//输出:"lovely"
// 
//
// 
//
// 提示: 
//
// 
// 1 <= s.length <= 100 
// s 由 ASCII 字符集中的可打印字符组成 
// 
// Related Topics 字符串

 

public String toLowerCase(String s) {
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if(chars[i]<='Z' && chars[i]>='A'){
                chars[i] = (char) (chars[i] + 32);
            }
        }
        return String.valueOf(chars);
    }

2、[788]旋转数字 

//我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 
//
// 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况
//下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。 
//
// 现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数? 
//
// 
//
// 示例: 
//
// 输入: 10
//输出: 4
//解释: 
//在[1, 10]中有四个好数: 2, 5, 6, 9。
//注意 1 和 10 不是好数, 因为他们在旋转之后不变。
// 
//
// 
//
// 提示: 
//
// 
// N 的取值范围是 [1, 10000]。 
// 
// Related Topics 字符串

这里旋转数字,我们只需要判断:1、一旦数字中包含3,4,7这三个数字中的其中一个就绝对没戏;2、数字中如果只包含0,1,8这三个,那么也绝对没戏。所以在这里我们采用递归的方式,先开始将一个标志位置为false,然后不断判断其下一位,一旦出现3,4,7直接返回false,出现了0,1,8继续保持false,出现3,4,7中的任意一位直接将标志位置为true。

public boolean good(int n, boolean flag){
        if(n == 0){
            return flag;
        }
        int d = n % 10;
        if(d == 3 || d == 4 || d == 7){
            return false;
        }
        if(d == 0 || d == 1 || d == 8){
            //这里主要是看前面有没有出现2,5,6,9等数,如果出现了就可能有戏
            //如果一直是0,1,8的话就可能不是好数了
            return good(n / 10, flag);
        }
        return good(n / 10, true);
    }

3、唯一摩尔斯密码词

//国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" 对应 "-...", "c
//" 对应 "-.-.", 等等。 
//
// 为了方便,所有26个英文字母对应摩尔斯密码表如下: 
//
// [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","-
//-","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--
//.."] 
//
// 给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + ".-" +
// "-..." 字符串的结合)。我们将这样一个连接过程称作单词翻译。 
//
// 返回我们可以获得所有词不同单词翻译的数量。 
//
// 例如:
//输入: words = ["gin", "zen", "gig", "msg"]
//输出: 2
//解释: 
//各单词翻译如下:
//"gin" -> "--...-."
//"zen" -> "--...-."
//"gig" -> "--...--."
//"msg" -> "--...--."
//
//共有 2 种不同翻译, "--...-." 和 "--...--.".
// 
//
// 
//
// 注意: 
//
// 
// 单词列表words 的长度不会超过 100。 
// 每个单词 words[i]的长度范围为 [1, 12]。 
// 每个单词 words[i]只包含小写字母。 
// 
// Related Topics 字符串

这个时候我们想到唯一,就是不重复,那么我们直接采用HashSet用来存储然后再输出HashSet的尺寸即可。

public int uniqueMorseRepresentations(String[] words) {
        String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....",
                "..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.",
                "...","-","..-","...-",".--","-..-","-.--","--.."};
        Set<String> strings = new HashSet<>();
        for (int i = 0; i < words.length; i++) {
            char[] chars = words[i].toCharArray();
            StringBuffer sb = new StringBuffer();
            for (int j = 0; j < chars.length; j++) {
                sb.append(morse[chars[j]-'a']);
            }
            strings.add(sb.toString());
        }
        return strings.size();
    }

4、最常见的单词 

//给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。 
//
// 题目保证至少有一个词不在禁用列表中,而且答案唯一。 
//
// 禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。 
//
// 
//
// 示例: 
//
// 输入: 
//paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
//banned = ["hit"]
//输出: "ball"
//解释: 
//"hit" 出现了3次,但它是一个禁用的单词。
//"ball" 出现了2次 (同时没有其他单词出现2次),所以它是段落里出现次数最多的,且不在禁用列表中的单词。 
//注意,所有这些单词在段落里不区分大小写,标点符号需要忽略(即使是紧挨着单词也忽略, 比如 "ball,"), 
//"hit"不是最终的答案,虽然它出现次数更多,但它在禁用单词列表中。
// 
//
// 
//
// 提示: 
//
// 
// 1 <= 段落长度 <= 1000 
// 0 <= 禁用单词个数 <= 100 
// 1 <= 禁用单词长度 <= 10 
// 答案是唯一的, 且都是小写字母 (即使在 paragraph 里是大写的,即使是一些特定的名词,答案都是小写的。) 
// paragraph 只包含字母、空格和下列标点符号!?',;. 
// 不存在没有连字符或者带有连字符的单词。 
// 单词里只包含字母,不会出现省略号或者其他标点符号。 
// 
// Related Topics 字符串

这个字符串,我先开始想着就直接用split对空格进行分割,然后再判断每个单词后面有没有标点符号再将标点给去掉,但是太天真了,它到了后面有些单词之间根本就没有空格,而是直接采用符号进行分割,还有可能是混合分割的,所以直接采用split函数很难分割的很好。所以我们直接采用一个个字符判断的形式,只要我们碰到的还是字母字符,我们就将其加在后面构成一个单词字符串,只要当我们碰到一个非字母单词,我们就判断前面我们收集到的那个单词字符串长度是否为0(这是为了避免连续出现两个非字母字符),如果大于0,那么我们就对它计数。还有一些值得注意的就是使用JAVA类自带的函数会让整个编程过程简单很多。比如isLetter()、toLowerCase()等。