截断电话号码

[题目链接](https://www.nowcoder.com/practice/078d1abcb55648f687a78d87e4b3cb69)

思路

牛牛用带短横线的格式记录电话号码,号码后面会跟若干以 # 开头的备注。拨打电话时,需要去掉备注部分,只保留数字和短横线组成的电话号码。

观察规律

输入字符串的结构是:电话号码 备注...,其中电话号码由数字 0-9 和短横线 - 组成,备注以空格分隔、以 # 开头。

因此,从字符串开头开始,连续的数字和短横线就是我们要的电话号码。遇到第一个不是数字也不是短横线的字符(通常是空格),就停止。

方法一:正则表达式

用正则 ^[\d\-]+ 从字符串开头匹配一段连续的数字和短横线即可。

方法二:逐字符遍历

从头扫描字符串,遇到数字或 - 就加入结果,遇到其他字符就退出循环。

两种方法本质相同,时间复杂度都是 ,其中 是字符串长度。

代码

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    getline(cin, s);
    string res;
    for (char c : s) {
        if (c >= '0' && c <= '9' || c == '-') {
            res += c;
        } else {
            break;
        }
    }
    cout << res << endl;
    return 0;
}
import java.util.*;
import java.util.regex.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        Matcher m = Pattern.compile("^[\\d\\-]+").matcher(s);
        if (m.find()) {
            System.out.println(m.group());
        }
    }
}
import re
s = input()
m = re.match(r'[\d\-]+', s)
print(m.group())
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (s) => {
    const m = s.match(/^[\d\-]+/);
    console.log(m[0]);
    rl.close();
});

复杂度分析

  • 时间复杂度,其中 是输入字符串的长度。只需遍历到电话号码结束位置。
  • 空间复杂度,用于存储结果字符串。