之前字符串反轉(zhuǎn)的題目
之前發(fā)的字符串反轉(zhuǎn)的題目
有很多人評(píng)論了,有的人還寫了自己的解題思路,還有人寫了自己的代碼

還有其中呼聲很高的壓棧解法

我相信很多人在筆試的時(shí)候一定會(huì)遇到這類題目,給你一個(gè)字符串,讓你找到一些規(guī)律,或者是找到某個(gè)字符串,或者是字符大小寫轉(zhuǎn)換等等。
我們先看一下,如果我們用棧來(lái)完成這個(gè)代碼要怎么寫?
我上面貼的那個(gè)答案其實(shí)就是用到了棧的思想,隊(duì)列的先進(jìn)先出,棧的話就是先進(jìn)后出。
所以上面的代碼

就是以棧形式,最后的位置先出來(lái)。
如果我那份代碼要用棧的形式呢?我寫了一個(gè)粗糙的版本
#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);
// 寫完了,大家有不明白的評(píng)論下
return 0;
}
但是我覺得不是很好,因?yàn)槔锩嬗玫搅?strong>內(nèi)存申請(qǐng),做嵌入式的應(yīng)該知道,內(nèi)存對(duì)于我們來(lái)說(shuō)是稀缺資源。
所以我還是覺得上面那個(gè)同學(xué)的寫法非常給力
也有人回復(fù)說(shuō)用異或來(lái)實(shí)現(xiàn)兩個(gè)變量的交換,變量交換的方法很多,但是面試的時(shí)候有時(shí)候會(huì)記不住,所以我們會(huì)寫最簡(jiǎn)單的方法,不過(guò)有些常見的方法大家可以試試。
#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;
}
大家如果還有更好的方法,歡迎繼續(xù)留言。
如果有看到和這道題目變種的筆試題,也歡迎留言。
評(píng)論
圖片
表情
