c++ 算法题-创建电话号码

题目

这是来自 codewars 的一道算法题,题目是这样的:

Write a function that accepts an array of 10 integers (between 0 and 9), that returns a string of those numbers in the form of a phone number.

例如输入:

1
createPhoneNumber(int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0});

返回:

1
returns "(123) 456-7890"

个人解答

拿到这道题我首先想到的是一个一个把这些 int 数字转换成 string 拼接在一起,并在需要的地方拼接需要的额外字符。这样用几个 +=for 循环应该是能做到,只需要知道如何进行格式转换即可。
因而我做出这样的东西:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <string>

std::string createPhoneNumber(const int arr [10]){
    std::string res;
    int i = 0;
    res += '(';
    for (; i < 3; i++){
        res +=  std::to_string(arr[i]);
    }
    res += ") ";
    for (; i < 6;i++){
        res +=  std::to_string(arr[i]);
    }
    res += '-';
    for (; i < 10;i++){
        res +=  std::to_string(arr[i]);
    }
    return res;
}

只能说也不是不能用吧,就是太冗杂了。在提交之后看到了好多解答都比我这个要简单得许多

他人解答

好评最多的老哥用的居然是古老的 c 方案,但是在 c++ 上也不是不行,哈哈哈哈。
他使用 snprintf() 函数,snprintf()的结构如下:

1
snprintf(char *__restrict s, size_t maxlen, const char *__restrict format, ...)

输入的需要是 char 类型,c 语言可没有 string 类啊。
snprintf()的形参第一个是 char* 类型的指针,指向一个字符串,也就是要输入进去的变量。
第二个是最大的长度。可以使用 sizeof(s)直接使用 s 字符串的大小
第三是格式和printf()里面差不多。给 “%d"之类的。
后面...,就是输入进去的参数,将这些参数丢给 %d 进行使用。

而这位老哥的答案是这样:

1
2
3
4
5
6
7
#include <string>

std::string createPhoneNumber(const int arr [10]){
  char buf[15];
  snprintf(buf, sizeof(buf), "(%d%d%d) %d%d%d-%d%d%d%d%d", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9]);
  return buf;
}

确实很简洁而且好用。
而返回的是 char 类型,没想到可以直接用……
不过,snprintf() 是定义在 c 语言 <stdio.h> 里面的函数,或许在 c++ 的 <iostream> 也是存在的?

还有一种是就是纯 c++ 解答了。使用字符串替换的方法,也是非常震惊强大。

1
2
3
4
5
6
7
8
9
#include <string>

std::string createPhoneNumber(const int digits[10]) {
  std::string res = "(...) ...-....";
  for (unsigned is = 0, id = 0; is < res.length(); is++)
    if (res[is] == '.')
      res[is] = '0' + digits[id++];
  return res;
}

没想到他连函数形参都改掉了
这个方法首先把模板写好,用. 作为要替换的地方,然后 for 循环遍历字符串。甚至建了两整型变量
让我们现在看看这两个整型变量 isid

  • is = 0 :is变量循环一次就自增一,对应的是指向 res数组遍历
  • id = 0: id 是指向输入的整型数组,输出的同时自增,用id++实现(太简洁了,这个操作!)

循环体内,首先判断指向的这个字符是不是 . 如果是,那么先替换空字符('0' 字符可不是 0 而是空字符),加上 idgits[id]。但是这时候字符 + 整形就变成字符了,空字符本来不存在,则这个地方就变成了一个数字字符。
这种方法是字符串替换,代码中的 . 可以被随意更换,你想变成 x 也是可以的!

萌ICP备20241614号