leetcode
leetcode 201 ~ 250
中心对称数

中心对称数

难度:

标签:

题目描述

代码结果

运行时间: 18 ms, 内存: 15.9 MB


/*
 * 思路:
 * 1. 使用Java Stream API来处理输入字符串。
 * 2. 将输入字符串转换为字符流,并使用流的操作来检查中心对称性。
 */
import java.util.Map;
import java.util.stream.IntStream;
 
public class Solution {
    public boolean isStrobogrammatic(String num) {
        // 定义中心对称数字的映射关系
        Map<Character, Character> map = Map.of('0', '0', '1', '1', '6', '9', '8', '8', '9', '6');
        // 将字符串转换为字符流,使用IntStream检查对称性
        return IntStream.range(0, (num.length() + 1) / 2)
                .allMatch(i -> map.containsKey(num.charAt(i)) && map.get(num.charAt(i)) == num.charAt(num.length() - 1 - i));
    }
}
 

解释

方法:

该题解使用双指针法来判断一个数是否为中心对称数。首先创建一个字典 strobo_dict,用于存储中心对称的字符对。然后将输入字符串转换为列表,方便进行字符操作。使用双指针 left 和 right 分别指向字符串的两端,向中间移动。在移动过程中,判断 left 和 right 指向的字符是否在 strobo_dict 中,以及它们是否对称。如果不满足条件,则返回 False。如果字符串长度为奇数,还需要判断中间字符是否为 '0'、'1' 或 '8'。如果通过所有判断,则返回 True。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在判断中心对称数时,为什么选择双指针法而不是其他方法如递归或单循环检查?
双指针法在这种场景中非常有效,因为它可以同时从字符串的两端向中心移动并对比字符。这种方法的时间复杂度为 O(n/2),即遍历一半字符串长度,这比逐个检查每个字符(单循环的 O(n) 时间复杂度)更高效。而递归方法虽然可行,但它通常涉及额外的内存开销用于递归调用栈,且在这个问题中并不提供额外的逻辑简化或性能优势。因此,双指针法既简洁又高效,特别适用于此类对称检查问题。
🦆
字典 strobo_dict 中包含的键值对是如何选取的,是否有遗漏或多余的元素?
字典 strobo_dict 中的键值对是精心选择的,它们代表了那些在180度旋转后仍然能够表示同一数字或互为镜像的数字。这些键值对包括:'0': '0'(0旋转后仍为0),'1': '1'(1旋转后仍为1),'6': '9'(6旋转后成为9),'8': '8'(8旋转后仍为8),'9': '6'(9旋转后成为6)。没有遗漏或多余的元素,因为其他数字(如2、3、4、5、7)在旋转后无法形成有效的对称数字。
🦆
对于字符串长度为奇数的情况,中间字符只能是 '0', '1', '8',这是基于什么样的考虑?
在字符串长度为奇数时,中间的字符在180度旋转后必须仍然显现为同一个字符,因此只能是那些旋转后能与自身相一致的数字。这些数字包括 '0'、'1' 和 '8'。这是因为这三个数字旋转180度后仍然保持不变,而其他数字要么变形(如6和9是互相旋转的),要么完全不是对称数字(如2、3、4、5、7)。这种设计确保了中心对称数的定义在任何长度的数字中都能被正确地验证。
🦆
对于检查过程中,当左右指针字符不匹配时直接返回 False,这种方法是否可能忽略了其他需要检查的部分?
在这种特定的问题设置中,如果任何一个字符对(即左右指针所指的字符)不符合中心对称的条件,那么整个字符串就不能被认定为中心对称数。因此,一旦发现不匹配的字符对,立即返回 False 是合理的,因为这意味着至少有一部分不满足中心对称的要求,无需进一步检查其余部分。这种方法是高效且符合逻辑的,确保了算法的正确性和性能。

相关问题

中心对称数 II

中心对称数 II

中心对称数 III

中心对称数 III

易混淆数

易混淆数