这是一个经典问题,必须处理元素列表,但第一个元素必须与其余元素区别对待。例如,打印一个字符串,以便每两个字符之间有一个短划线。
这是一个相当可怕的例子
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
首先,这种情况有一个共同的名称,所以我可以正确查找它吗?
其次,当然,处理这类问题的更好方法是什么? “更好”是更少的代码行,更快的运行时间或更低的内存开销(最好是它们之间的快乐妥协)。
以任何语言发布示例代码。
答案 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'