之前发的字符串反转的题目
这道字符串反转的题目,你能想到更好的方法吗?
有很多人评论了,有的人还写了自己的解题思路,还有人写了自己的代码
还有其中呼声很高的压栈解法
我相信很多人在笔试的时候一定会遇到这类题目,给你一个字符串,让你找到一些规律,或者是找到某个字符串,或者是字符大小写转换等等。
我们先看一下,如果我们用栈来完成这个代码要怎么写?
我上面贴的那个答案其实就是用到了栈的思想,队列的先进先出,栈的话就是先进后出。
栈,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 thevoid 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 ehtvoid 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 thevoid 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;
}
大家如果还有更好的方法,欢迎继续留言。
如果有看到和这道题目变种的笔试题,也欢迎留言。