首页 > 试题广场 >

找到特殊的电话号码

[编程题]找到特殊的电话号码
  • 热度指数:48 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 电话费用表

+------+---------------+
| 字段名称 | 类型            |
+------+---------------+
| 电话号码 | varchar(512)  |
| 月份   | int          |
| 月消费  | decimal(10,1) |
+------+---------------+

电话号码、月份 是该表的主键。
该表的每一行表示 该电话号码在某个月份的消费金额,包含电话号码、月份和月消费。

 

问题一:编写一个 SQL 查询,查找2017年以来(截至2017年10月31日)所有四位尾数符合AABB或者ABAB或者AAAA的电话号码(A、B分别代表1-9中任意的一个数字)。

查询结果如下例所示。

 

示例 1:

输入: 表:电话费用表
+----------+--------+--------+
| 电话号码     | 月份     | 月消费    |
+----------+--------+--------+
| 64262631 | 201711 | 30.6   |
| 64262645 | 201711 | 40.8   |
| 64262659 | 201711 | 51     |
| 64262673 | 201706 | 61.2   |
| 64262687 | 201706 | 71.4   |
| 64262701 | 201706 | 81.6   |
| 64262715 | 201706 | 91.8   |
| 64262701 | 201707 | 81.6   |
| 64262715 | 201707 | 91.8   |
| 64262701 | 201708 | 81.6   |
| 64262715 | 201708 | 91.8   |
| 64262729 | 201712 | 102    |
| 64262743 | 201712 | 112.2  |
| 64262757 | 201712 | 122.4  |
| 64262771 | 201712 | 132.6  |
| 64262715 | 201710 | 0      |
| 64262727 | 201704 | 52.3   |
| 64262277 | 201704 | 59.1   |
| 64262727 | 201705 | 40.5   |
| 64262277 | 201705 | 0      |
| 64262222 | 201705 | 96.2   |
| 64262715 | 201710 | 0      |
+----------+--------+--------+ 输出: +----------+
| 电话号码     |
+----------+
| 64262222 |
| 64262277 |
| 64262727 |
+----------+ 解释: 先分别截取出电话号码的后四位数,生成四个新的字段,再筛选出符合条件的电话号码。
示例1

输入

CREATE TABLE `电话费用表` 
(
    `电话号码` VARCHAR(512),
    `月份` INT,
    `月消费` DECIMAL(10,1)
);
-- 插入电话费用表的数据
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262631', 201711, 30.6);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262645', 201711, 40.8);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262659', 201711, 51.0);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262673', 201706, 61.2);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262687', 201706, 71.4);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262701', 201706, 81.6);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262715', 201706, 91.8);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262701', 201707, 81.6);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262715', 201707, 91.8);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262701', 201708, 81.6);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262715', 201708, 91.8);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262729', 201712, 102.0);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262743', 201712, 112.2);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262757', 201712, 122.4);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262771', 201712, 132.6);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262715', 201710, 0.0);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262727', 201704, 52.3);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262277', 201704, 59.1);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262727', 201705, 40.5);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262277', 201705, 0.0);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262222', 201705, 96.2);
INSERT INTO `电话费用表` (`电话号码`, `月份`, `月消费`) VALUES ('64262715', 201710, 0.0);

输出

电话号码
64262727
64262277
64262222
SELECT DISTINCT 电话号码
FROM 电话费用表
WHERE
  -- 过滤2017年1月至10月的记录
  月份 BETWEEN 201701 AND 201710
  -- 匹配后四位符合AABB/ABAB/AAAA模式
  AND (
    RIGHT(电话号码, 4) REGEXP '^([1-9])\\1{3}$'       -- AAAA(四位相同)
    OR RIGHT(电话号码, 4) REGEXP '^([1-9])\\1([1-9])\\2$' -- AABB(前两位同、后两位同)
    OR RIGHT(电话号码, 4) REGEXP '^([1-9])([1-9])\\1\\2$' -- ABAB(第1=3位、第2=4位)
  );
发表于 2025-11-12 16:25:24 回复(0)