昨天乙個哥們面試,面試官給他出一道題:將字串反轉,如qwert,反轉為trewq;將乙個句子反轉,如do one thing,反轉為thing one do。
首先,這個題目可以可以分為兩個題目來做。1、反轉字串。2、反轉句子。
1、反轉字串:
我這裡用了兩種方法:
(1)定義乙個反轉函式,裡面定義乙個begin和end指標指向頭和尾,將頭和尾進行交換,交換後進行begin++,end--。其**如下:
void myreserve(char *str)(2)定義乙個反轉函式,裡面new乙個strlen+1的堆空間,使用類似二分法,將strlen的長度除以2,定義臨時變數進行首尾交換。}
char* myreservetwo(const上面返回乙個new的空間,純屬於個人使用下這種方式而已,其實自己在專案完全沒有必要,但如果使用new,記得delete哦。全部**如下:char*str)
return
temp;
}
#include #include輸出如下:void myreserve(char *str)
} char* myreservetwo(const
char*str)
return
temp;
}int main(int argc, char**ar**)
2、反轉句子
我那個哥們昨晚跟我討論了下,關於反正字串,比較簡單,但是反轉句子,做起來總是給自己感覺寫的太複雜了。我還是說下思路:
首先將所有的字元反正,然後再反轉每個單詞。我開始也是用呼叫上的myreserve函式將整個句子反轉,然後用strchr查詢空格,定義指標p=strchr的返回值,再將p所指向的單個單詞進行反轉,最後用strcat將所有反轉的單詞拼接起來。最後也實現了,但是寫的太複雜了,最後在網上看到乙個還不錯的例子,實現思想和我的一致,但是**比我寫的簡潔多了,所以就不展示我的**了,下面附網上一位仁兄相對我而言比較簡潔的寫法(比自己寫的優秀的**就應該學習學習哈.......):
#include #include上面**的注釋是我自己加上的去的,還對其稍微進行了下優化,如變數初始化等。char s[50001]=""
;
void reverse(int begin,int
end)
printf(
"%s \n
", s);
}
intmain()
}printf(
"%s\n
",s);
}return0;
}
下面數輸出:
自己輸入:do one thing at a time,and do well,最後輸出:well do well,and a at thing one do
總結下:上面分別實現了反轉字串和反轉句子。反轉字串用了兩種方法實現的,其思想類似二分法,進行前後字元交換;反轉句子是先實現整個句子反轉,再實現單個單詞的反轉。上面的**看上也許你覺得很簡單,但是我們只要把簡單的事情做好了,自己的技術自然而然就不簡單了,就像我一哥們說的:**有那麼多一戰成名,唯有百鍊成鋼。
posted @
2018-02-09 12:22
1點er執著 閱讀(
...)
編輯收藏
字串反轉 和 字元逆序
寫出乙個程式,接受乙個字串,然後輸出該字串反轉後的字串。輸入n個字元 輸出該字串反轉後的字串 abcd dcba 存陣列,倒著輸出交換收尾順序注意!這個 可以處理含有空格的字串,所以這兩道題的解法是一樣的。include include using namespace std 交換元素 void s...
反轉字串, 以單詞反轉句子
給乙個字串,將其按照單詞順序進行反轉。比如說 the sky is blue 那麼反轉就是 blue is sky the 反轉字串 fileprivate func reverse chars inout t start int,end int 反轉句子,以單詞反轉 func reversewor...
字串反轉
據說一道微軟的面試題,要求考慮時間和空間的優化,下面給出幾種通常字串反轉的方法 1 直接陣列操作 char strreverse char str return str 這種做法原來的str沒有儲存,原來的str也改變了 2 指標操作 char strreverse char str return ...