【LeetCode】1056-易混淆数

易混淆数

给定一个数字 N,当它知足如下条件的时候返回 true:把原数字旋转180°之后获得新的数字。如 0, 1, 6, 8, 9 旋转 180° 之后,获得了新的数字 0, 1, 9, 8, 6 。2, 3, 4, 5, 7 旋转 180° 后,获得的不是数字。易混淆数字 (confusing number) 就是一个数字旋转180°之后,获得和原来不一样的数字,且新数字的每一位都是有效的。java

示例 1:
输入:89
输出:true
解释:
把 89 旋转 180° 之后获得 68,68 是有效数字且 68!=89 。
示例 2:
输入:25
输出:false
解释:
把 25 旋转 180° 之后获得的不是数字。spring


分析

1. 已知0, 1, 6, 8, 9 旋转 180° 之后,获得新的数字 0, 1, 9, 8, 6。 那么给定一个整数,我能够先分析它里面每位数字旋转状况。如619,将每位数字用旋转后新的数字代替就成了916,可是按总体来旋转180°应该是619,因此咱们还须要将916反转。经过分析,若是采用java来实现的话,能够先将整数N转化成字符串str,用hashmap来存储0, 1, 6, 8, 9以及它们对应旋转以后的值,在这里咱们还须要建立一个StringBuilder对象tmp来接收旋转后的值并将它们组合成字符串,从字符串str中依次取出每位数字放在hashmap中寻找,若是找到了就将结果链接到tmp中(至于旋转以后不是数字的状况我将在后面讨论),直到遍历完str,咱们就获得了每位数字原地旋转的状况,接着用StringBuilder类中的reverse方法能够将字符串反转,用toString方法将其转化成String类再作相应判断。部分代码以下:app

String str = Integer.toString(N);

Map<Character, Character> map=new HashMap<>();
map.put('0','0');
map.put('1','1');
map.put('6','9');
map.put('8','8');
map.put('9','6');

StringBuilder tmp =new StringBuilder();

for(int i = 0; i < str.length(); i++){
    tmp.append(map.get(str.charAt(i)));
}

2. 2,3, 4, 5, 7 旋转 180° 后,获得的不是数字。 很显然,若是给定的整数N中存在这些数,那么N必定不是易混淆数,直接返回false。部分代码以下:ui

char[] ch = {'2','3','4','5','7'};
    for(char c : ch){
        if(str.indexOf(c) != -1)
            return false;
    }

3. 易淆数字 (confusing number) 就是一个数字旋转180°之后,获得和原来不一样的数字,且新数字的每一位都是有效的。 这里说明整数N旋转180°之后不能仍为N, 如我在1中提到的619,旋转以后仍为619,那么它并非易混淆数。部分代码以下:code

if(tmp.reverse().toString().equals(str))
            return false;
        else
            return true;

总结

对于这个问题,若是咱们从总体考虑的话有点无从下手,因此采起化整为零,再化零为整的策略就容易的多,下面附上所有的代码:对象

public static boolean confusingNumber(int N) {
        String str = Integer.toString(N);

        char[] ch = {'2','3','4','5','7'};
        for(char c : ch){
            if(str.indexOf(c) != -1)
                return false;
        }

        Map<Character, Character> map=new HashMap<>();
        map.put('0','0');
        map.put('1','1');
        map.put('6','9');
        map.put('8','8');
        map.put('9','6');

        StringBuilder tmp =new StringBuilder();
        for(int i = 0; i < str.length(); i++){
            tmp.append(map.get(str.charAt(i)));
        }

        if(tmp.reverse().toString().equals(str))
            return false;
        else
            return true;
}
相关文章
相关标签/搜索