第一次通过成语

时间:2013-10-03 13:36:32

标签: language-agnostic

这是一个经典问题,必须处理元素列表,但第一个元素必须与其余元素区别对待。例如,打印一个字符串,以便每两个字符之间有一个短划线。

这是一个相当可怕的例子

    char *text = "hello";

    for (int i = 0; i < strlen(text); i++) {

            if (i == 0) {
                    printf("%c", text[i]);
            } else {
                    printf("-%c", text[i]);
            }
    }

输出:

h-e-l-l-o

首先,这种情况有一个共同的名称,所以我可以正确查找它吗?

其次,当然,处理这类问题的更好方法是什么? “更好”是更少的代码行,更快的运行时间或更低的内存开销(最好是它们之间的快乐妥协)。

以任何语言发布示例代码。

2 个答案:

答案 0 :(得分:3)

坚持使用您编写的原始C语言,通常最好尽可能将特殊情况保留在循环之外,因为循环意味着重复执行相同的任务。我会将代码编写为:

char *text = "hello";

printf("%c", text[0]);
for (int i = 1; i < strlen(text); i++){
    printf("-%c", text[i]);
}

通常最后一个也可能是一个特例,在这种情况下,你会循环到strlen(text) - 1。当然,如果您使用的API语言专门处理此问题,那么请使用@TylerEaves中的答案。我不知道这类问题的具体名称,但无论何时调整循环边界,都要小心off-by-one error

答案 1 :(得分:0)

在python中,你的例子是一个简单的“ - ”。join(list(text))

因此,.join是String类的一个方法。它将单个列表(数组)作为参数,并在列表中的项之间插入字符串。 list函数,当传递一个字符串时返回一个字符列表。

解释员会话扩展我的评论

>>> test = "this is a string"
>>> list(test)
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g']
>>> "-".join(list(test))
't-h-i-s- -i-s- -a- -s-t-r-i-n-g'