之前字符串反转的题目

嵌入式Linux

共 3644字,需浏览 8分钟

 · 2022-06-28

之前发的字符串反转的题目

这道字符串反转的题目,你能想到更好的方法吗?

有很多人评论了,有的人还写了自己的解题思路,还有人写了自己的代码


还有其中呼声很高的压栈解法


我相信很多人在笔试的时候一定会遇到这类题目,给你一个字符串,让你找到一些规律,或者是找到某个字符串,或者是字符大小写转换等等。

我们先看一下,如果我们用栈来完成这个代码要怎么写?

我上面贴的那个答案其实就是用到了栈的思想,队列的先进先出,栈的话就是先进后出。

栈,C语言实现

所以上面的代码


就是以栈形式,最后的位置先出来。

如果我那份代码要用栈的形式呢?我写了一个粗糙的版本

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

char input[] = {"the sky is blue"};

//题目:

//input  the sky is blue
//output blue is sky the

void reverseWords(char* s, size_t n) {
 char *stack = (char*)malloc(n);
 memcpy(stack, s, n);
 for (int i=0; i<n; i++) {
  *(s + i) = *(stack + n -i -1); 
 }
 if (stack) {
  free(stack);
  stack = NULL;
 }
}

//eulb si yks eht

void reverseWords_by_space(char* s, int n) {

 int i = 0;
 int len = 0;
 for (i=0; i<n; i++) {
  if (s[i] == ' ') {
   reverseWords(s+i-len, len);
   len = 0;
  } else if (s[i] == '\0') {
   reverseWords(s+i-len, len);
   len = 0;   
  }else {
   ++len;
  }
 }

}

int main(void) {

 printf("%s\n", input);
 reverseWords(input,strlen(input));
 reverseWords_by_space(input,sizeof(input));
 printf("%s\n", input);
 // 写完了,大家有不明白的评论下
 return 0;

}

但是我觉得不是很好,因为里面用到了内存申请,做嵌入式的应该知道,内存对于我们来说是稀缺资源。

所以我还是觉得上面那个同学的写法非常给力

也有人回复说用异或来实现两个变量的交换,变量交换的方法很多,但是面试的时候有时候会记不住,所以我们会写最简单的方法,不过有些常见的方法大家可以试试。

#include "stdio.h"

void swap4(int *a,int *b) {
 *a = (*a + *b) - (*b = *a);
}

void swap3(int *a,int *b) {
 *a = (*a ^ *b) ^ (*b = *a);
}

void swap2(int *a,int *b) {
 *a = *a + *b;
 *b = *a - *b;
 *a = *a - *b;
}

void swap1(int *a,int *b) {
 *a = *a^*b;
 *b = *a^*b;
 *a = *a^*b;
}

int main(void) {
 int a = 3,b = 4;
 printf("a=%d,b=%d\n",a,b);
 swap1(&a,&b);
 printf("a=%d,b=%d\n",a,b);
 swap2(&a,&b);
 printf("a=%d,b=%d\n",a,b);
 swap3(&a,&b);
 printf("a=%d,b=%d\n",a,b);
 swap4(&a,&b);
 printf("a=%d,b=%d\n",a,b);
 return 0;

}
输出


晚上想再更新下代码
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char input[] = {"the sky is blue cris 1212321 apple"};

//题目:

//input  the sky is blue
//output blue is sky the

void reverseWords(char* s, size_t n) {
 *(s+n-1) = '\0';
 printf("%s ",s);
}

int main(void) {
 int size = sizeof(input);
 printf("%s\n",input);
 for (int i=0,n=0; i<=size; i++,n++) {
  if (*(input+size-i-1) == ' ' || i == size){
   reverseWords(input+size-i, n);
   n = 0;
  }
 }
 return 0;
}

大家如果还有更好的方法,欢迎继续留言。
如果有看到和这道题目变种的笔试题,也欢迎留言。



浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报