题目
这是来自 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.
例如输入:
|
|
返回:
|
|
个人解答
拿到这道题我首先想到的是一个一个把这些 int 数字转换成 string 拼接在一起,并在需要的地方拼接需要的额外字符。这样用几个 += 和 for 循环应该是能做到,只需要知道如何进行格式转换即可。
因而我做出这样的东西:
|
|
只能说也不是不能用吧,就是太冗杂了。在提交之后看到了好多解答都比我这个要简单得许多
他人解答
一
好评最多的老哥用的居然是古老的 c 方案,但是在 c++ 上也不是不行,哈哈哈哈。
他使用 snprintf() 函数,snprintf()的结构如下:
|
|
输入的需要是 char 类型,c 语言可没有 string 类啊。
snprintf()的形参第一个是 char* 类型的指针,指向一个字符串,也就是要输入进去的变量。
第二个是最大的长度。可以使用 sizeof(s)直接使用 s 字符串的大小
第三是格式和printf()里面差不多。给 “%d"之类的。
后面...,就是输入进去的参数,将这些参数丢给 %d 进行使用。
而这位老哥的答案是这样:
|
|
确实很简洁而且好用。
而返回的是 char 类型,没想到可以直接用……
不过,snprintf() 是定义在 c 语言 <stdio.h> 里面的函数,或许在 c++ 的 <iostream> 也是存在的?
二
还有一种是就是纯 c++ 解答了。使用字符串替换的方法,也是非常震惊强大。
|
|
没想到他连函数形参都改掉了
这个方法首先把模板写好,用. 作为要替换的地方,然后 for 循环遍历字符串。甚至建了两整型变量
让我们现在看看这两个整型变量 is 和 id:
is = 0:is变量循环一次就自增一,对应的是指向res数组遍历id = 0:id是指向输入的整型数组,输出的同时自增,用id++实现(太简洁了,这个操作!)
循环体内,首先判断指向的这个字符是不是 . 如果是,那么先替换空字符('0' 字符可不是 0 而是空字符),加上 idgits[id]。但是这时候字符 + 整形就变成字符了,空字符本来不存在,则这个地方就变成了一个数字字符。
这种方法是字符串替换,代码中的 . 可以被随意更换,你想变成 x 也是可以的!