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





















