1694. 重新格式化电话号码:简单模拟

314 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

题目描述

这是 力扣上的 1694. 重新格式化电话号码,难度为 简单

给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。

请你按下述方式重新格式化电话号码。

首先,删除 所有的空格和破折号。

其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:

2 个数字:单个含 2 个数字的块。

3 个数字:单个含 3 个数字的块。

4 个数字:两个分别含 2 个数字的块。

最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。

返回格式化后的电话号码。

题目分析

看了题目,很明确是一个字符串类型的题目

继续看示例,我们其实基本上就有思路了,我们可以按照题目给出的思路来进行模拟

  • 第一步去除空格和破折号,抽出数字出来
  • 第二步,判断数字个数是否是大于 4 个的,如果是则,进行 3 个 3 个的分,如果不是,则按照题目逻辑进行模拟
  • 最终在每个分割的点上加上破折号即可

有思路进行模拟了,那么我们编码的时候需要如何去实现呢?

例如我一般是喜欢使用 golang 来进行刷题,如果是使用 C 来进行刷题的话,稍微涉及到字符串,结构体,指针等的内容就麻烦的一匹

不过编码的实现上,方法大体一致:

  • 替换指定的字符串,golang 中可以使用 strings 包中的 replece

    • C 的话,暂时没现成的函数,咱们就换成提取 数字即可,姑且就令这个 数字数组为 digital 吧
  • 根据数字的长度来进行分割,并在分割点上面加上破折号, golang 的话,直接使用字符串切片的方式,满足条件就加入切片,最终使用 strings 包的 Join 函数即可将切片中的元素连接起来

    • 使用 C 语言的话就稍微麻烦一点,咱们需要开辟足够多的空间,例如数字的个数为 n,那么我们就开辟 2*n个字节的空间,因此咱们输出的结果是一个字符串,此处的一个字符是占一个字节的,然后在使用 strcopy 的方式,按照逻辑从 digital 中拷贝指定个数的数字到咱们的结果字符串中,并加上破折号即可

Golang 版本的实现相对简单

func reformatNumber(number string) string {
    // 替换字符
    s := strings.ReplaceAll(number, " ", "")
    s = strings.ReplaceAll(s, "-", "")
    ans := []string{}
    i := 0
    // 数字加入到 字符串切片中
    for ; i+4 < len(s); i += 3 {
        ans = append(ans, s[i:i+3])
    }
    // 处理剩余的数字
    s = s[i:]
    if len(s) < 4 {
        ans = append(ans, s)
    } else {
        ans = append(ans, s[:2], s[2:])
    }
    return strings.Join(ans, "-")
}

C 语言版本的实现相对稍微麻烦一点

本题时间复杂度和空间复杂度都是 O(n)

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~