题目描述
这是 力扣上的 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)
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~