【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°以后,得到和原来不同的数字,且新数字的每一位都是有效的。
示例 1:
输入:89
输出:true
解释:
把 89 旋转 180° 以后得到 68,68 是有效数字且 68!=89 。
示例 2:
输入:25
输出:false
解释:
把 25 旋转 180° 以后得到的不是数字。
分析
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类再做相应判断。部分代码如下:
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。部分代码如下:
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,那么它并不是易混淆数。部分代码如下:
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; }
上一篇: 荐 Android 应用启动流程简单整理
下一篇: 学会鉴别网站内容质量 促进网站持续发展