昨天发的笔试题目,留言的人还挺多,这道笔试题目是字节的嵌入式笔试题目,从面试的朋友描述说,对方的面试过程很专业。
现场写代码,
金三银四一直是铁律,去年我一个朋友离职后,也是最近这几天拿到了决定性的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;
}
代码是简单了些,但是这样的笔试题,我相信也不是每个人都能很快就写出来的,如果对大家有帮助的,帮忙点赞转发呗
代码输出