昨天发的笔试题目,留言的人还挺多,这道笔试题目是字节的嵌入式笔试题目,从面试的朋友描述说,对方的面试过程很专业。
现场写代码,
金三银四一直是铁律,去年我一个朋友离职后,也是最近这几天拿到了决定性的offer。
既然面试机会多,如果想看机会,就必须要准备,像这类的字符串变换的笔试题目真不要太多了。
昨天的题目,有网友留言说使用字符串反转来完成
我早上陪小孩上篮球课,拿着电脑给大家补充下解答代码
字符串两次翻转的代码实现如下
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int string_reverse(char str[], int length)
{
char tmp;
for (int i = 0; i < length/2; i++) {
tmp = str[i];
str[i] = str[length - i - 1];
str[length - i - 1] = tmp;
}
}
int main() {
char input[] = "welcome to hello world";
char *p = NULL;
printf("%s\n", input);
string_reverse(input, strlen(input));
printf("%s\n", input);
p = (char*)&input;
for (int i = 0, length = 0; i < sizeof(input); i++, length++) {
if (input[i] == ' ' || input[i] == '\0') {
string_reverse(p, length);
p = &input[i];
length = 0;
}
}
printf("%s\n", input);
return 0;
变换的过程是
但是实际编码的时候,发现上面的代码会有点问题,因为第一次记数和后面的记数长度不同,导致实际的输出结果变成了这样。
第一个单词记数是从0开始,后面记数的时候,多了一个空格。
代码更新如下
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int string_reverse(char str[], int length)
{
char tmp;
for (int i = 0; i < length/2; i++) {
tmp = str[i];
str[i] = str[length - i - 1];
str[length - i - 1] = tmp;
}
}
int main() {
char input[] = "welcome to hello world";
char *p = NULL;
int num = 0;
printf("%s\n", input);
string_reverse(input, strlen(input));
p = (char*)&input;
for (int i = 0, length = 0; i < sizeof(input); i++, length++) {
if (input[i] == ' ' || input[i] == '\0') {
string_reverse(p, length);
p = &input[i + 1]; //偏移掉空格掉位置
length = -1; // 因为这时候多了一个空格
}
}
printf("%s\n", input);
return 0;
}
代码是简单了些,但是这样的笔试题,我相信也不是每个人都能很快就写出来的,如果对大家有帮助的,帮忙点赞转发呗
代码输出