美文网首页算法刷题
LeetCode刷题-中心对称数

LeetCode刷题-中心对称数

作者: 小鲨鱼FF | 来源:发表于2021-11-03 08:58 被阅读0次

    前言说明

    算法学习,日常刷题记录。

    题目连接

    中心对称数

    题目内容

    中心对称数是指一个数字在旋转了180度之后看起来依旧相同的数字(或者上下颠倒地看)。

    请写一个函数来判断该数字是否是中心对称数,其输入将会以一个字符串的形式来表达数字。

    示例1:

    输入: num = "69"

    输出: true

    示例2:

    输入: num = "88"

    输出: true

    示例3:

    输入: num = "962"

    输出: false

    示例4:

    输入:num = "1"

    输出:true

    分析过程

    思路:双指针法。

    注意:这道题要注意理解题意,这里不是回文数,回文数是倒序和顺序一致,而这里是旋转180度,旋转180度后数字被移动到对称的下标处,只有0、1和8旋转180度后还是自身,6旋转180度是9,9旋转180度后是6,其他数字旋转180度后不是正确的数字,可直接判断为false

    第一步

    遍历字符串,从两边往中间,即双指针向字符串中间靠拢,直到左指针大于右指针。

    第二步

    获取左指针字符c1,获取右指针字符c2,判断字符是否为对称数字,即可以旋转180度的数字,只有0、1、8、6、9旋转180度后还是正确的数字。

    若两个字符c1和c2都是对称数字,继续下一步的判断;若两个字符c1和c2不都是对称数字,那么肯定不是中心对称数,直接返回false。

    第三步

    判断字符是否为对称相等数字,即在旋转180度后相等的数字,只有0、1、8旋转180度后还相等。

    若两个字符c1和c2都是对称相等的数字,那么字符就限定在了0、1、8,这时候若两个字符c1和c2不相等,即旋转180度后就不是中心对称数了,直接返回false,否则继续。

    若两个字符c1和c2不都是对称相等的数字,那么字符可能都是6、9,或者一个字符是6、9,另一个字符是0、1、8,这时候只有当一个字符是6,另一个字符是9时,才是符合条件的,符合条件的继续,否则肯定不是中心对称数,直接返回false。

    第四步

    若能遍历完字符串,证明是中心对称数,返回true。

    解答代码

    class Solution {
        public boolean isStrobogrammatic(String num) {
            // 双指针法
    
            // 这道题要注意理解题意,这里不是回文数,回文数是倒序和顺序一致,而这里是旋转180度,旋转180度后数字被移动到对称的下标处,只有0、1和8旋转180度后还是自身,6旋转180度是9,9旋转180度后是6,其他数字旋转180度后不是正确的数字,可直接判断为false
            
            // 遍历,双指针向中间靠拢,直到左指针大于右指针
            for (int i = 0, j = num.length() - 1; i <= j; ++i, --j) {
                // 获取左指针字符
                char c1 = num.charAt(i);
                // 获取右指针字符
                char c2 = num.charAt(j);
    
                if (isSymmetryChar(c1) && isSymmetryChar(c2)) {
                    // 若两个字符都是对称数字,继续下一步的判断
                    if (isEqualChar(c1) && isEqualChar(c2)) {
                        // 若两个字符都是对称相等的数字,那么字符就限定在了0、1、8
                        if (c1 != c2) {
                            // 若两个字符不相等,旋转180度后就不是中心对称数了,直接返回false
                            return false;
                        }
                    } else {
                        // 若两个字符不都是对称相等的数字,那么字符可能都是6、9,或者一个字符是6、9,另一个字符是0、1、8
                        if (!((c1 == '6' && c2 == '9') || (c1 == '9' && c2 == '6'))) {
                            // 只有当一个字符是6,另一个字符是9时,才是符合条件的,否则肯定不是中心对称数,直接返回false
                            return false;
                        }
                    }
                } else {
                    // 若两个字符不都是对称数字,那么肯定不是中心对称数,直接返回false
                    return false;
                }
            }
    
            // 若能遍历完,证明是中心对称数,返回true
            return true;
        }
    
        // 判断是否为对称数字,即可以旋转180度的数字,只有0、1、8、6、9旋转180度后还是正确的数字
        private boolean isSymmetryChar (char c) {
            return c == '0' || c == '1' || c == '8' || c == '6' || c == '9';
        }
    
        // 判断是否为对称相等数字,即在旋转180度后相等的数字,只有0、1、8旋转180度后还相等
        private boolean isEqualChar (char c) {
            return c == '0' || c == '1' || c == '8';
        }
    }
    

    提交结果

    执行用时1ms,时间击败100.00%的用户,内存消耗36.2MB,空间击败31.50%的用户。

    运行结果

    原文链接

    原文链接:中心对称数

    相关文章

      网友评论

        本文标题:LeetCode刷题-中心对称数

        本文链接:https://www.haomeiwen.com/subject/jnqqzltx.html