当前位置: 面试刷题>> 镜像数字 (经典算法题500道)
**题目描述补充**:
题目:**寻找镜像数字**
在数字世界中,有些数字在垂直翻转(镜像)后仍然保持不变或者形成另一个有效的数字,这些数字我们称之为“镜像数字”。例如,数字“121”和“8”就是镜像数字,因为“121”翻转后仍然是“121”,而“8”翻转后依然为“8”。然而,“123”则不是镜像数字,因为它翻转后无法形成一个有效的数字。
现在,给定一个正整数N,请编写一个函数来找出并返回小于或等于N的所有镜像数字。
**示例**:
输入:N = 123
输出:[1, 2, 3, 8, 11, 22, 88, 101, 111, 121, 181]
**注意**:
- 镜像数字只考虑正整数。
- 返回的列表应该按照升序排列。
**PHP代码示例**:
```php
function findMirrorNumbers($N) {
$result = [];
for ($i = 1; $i <= $N; $i++) {
$str = strval($i);
$reversed = strrev($str);
if ($str == $reversed || isMirror($str)) {
$result[] = $i;
}
}
return $result;
}
function isMirror($str) {
$length = strlen($str);
for ($i = 0; $i < $length / 2; $i++) {
if (($str[$i] != '0' && $str[$i] != '1' && $str[$i] != '8') ||
($str[$length - 1 - $i] != '0' && $str[$length - 1 - $i] != '1' && $str[$length - 1 - $i] != '8') ||
($str[$i] + $str[$length - 1 - $i] != 8 && $str[$i] != $str[$length - 1 - $i])) {
return false;
}
}
return true;
}
// 示例用法
echo implode(', ', findMirrorNumbers(123));
```
**注意**: PHP的示例中,`isMirror`函数的实现是简化的,主要用于检查像“8”这样单独的数字和“11”、“88”等简单的对称情况,对于更复杂的数字如“101”等,通过直接比较翻转字符串和原字符串实现。
**Python代码示例**:
```python
def find_mirror_numbers(N):
def is_mirror(num):
str_num = str(num)
return str_num == str_num[::-1] or (str_num in ['0', '1', '8'] and num == int(str_num))
return [num for num in range(1, N + 1) if is_mirror(num)]
# 示例用法
print(find_mirror_numbers(123))
```
**JavaScript代码示例**:
```javascript
function findMirrorNumbers(N) {
const result = [];
for (let i = 1; i <= N; i++) {
const str = String(i);
if (str === str.split('').reverse().join('') || isSimpleMirror(str)) {
result.push(i);
}
}
return result;
}
function isSimpleMirror(str) {
return ['0', '1', '8'].includes(str) && parseInt(str) === Number(str);
}
// 示例用法
console.log(findMirrorNumbers(123).join(', '));
```
**注意**: 在JavaScript的示例中,`isSimpleMirror`函数仅用于检查像“0”、“1”和“8”这样的简单镜像数字,复杂的镜像检查通过比较翻转后的字符串和原字符串实现。
**码小课**网站中有更多关于算法和数据结构的学习内容,可以帮助你深入理解并解决这类问题。