之前字符串反转的题目
嵌入式Linux
共 3644字,需浏览 8分钟
·
2022-06-28 11:47
之前发的字符串反转的题目
有很多人评论了,有的人还写了自己的解题思路,还有人写了自己的代码
还有其中呼声很高的压栈解法
我相信很多人在笔试的时候一定会遇到这类题目,给你一个字符串,让你找到一些规律,或者是找到某个字符串,或者是字符大小写转换等等。
我们先看一下,如果我们用栈来完成这个代码要怎么写?
我上面贴的那个答案其实就是用到了栈的思想,队列的先进先出,栈的话就是先进后出。
所以上面的代码
就是以栈形式,最后的位置先出来。
如果我那份代码要用栈的形式呢?我写了一个粗糙的版本
#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;
}
大家如果还有更好的方法,欢迎继续留言。
如果有看到和这道题目变种的笔试题,也欢迎留言。
评论