文字列逆シーケンスのまとめ
3879 ワード
タイトル:文字列を受け入れ、反転した文字列を出力します.例えばs=「abcd」であり,逆シーケンス後にs=「dcba」となる.
この問題は比較的簡単で、方法もたくさんあります.ここで簡単にまとめて、参考にします.
プログラム1−プログラム4はいずれも比較的基本的な方法であり,プログラム5−プログラム8は比較的高度な方法である.
プログラム1
原地逆序(in-place reverse)これは最もよく考えられ、原地逆序は余分な分配空間を許さないことを意味し、主に以下のいくつかの方法があり、思想があまり悪くなく、文字列の両側の文字を1つずつ交換することであり、以下の図である.与えられた文字列「abcdef」は、逆シーケンスのプロセスが、それぞれ、交換文字aおよびf、交換文字bおよびe、交換文字cおよびdである.2つのポインタを設定して、文字列の頭と尾を指し、2つのポインタが指す文字を交換し、交差するまでポインタを中間に移動します.
拡張:単語の逆順序
文字列が与えられ、単語ごとに文字列が逆順序になり、例えば「This is a sentence」が与えられた場合、出力は「sentence a is This」であり、問題を簡略化するために文字列には句読点が含まれない.
2段階に分ける
1単語の逆順で「sihT si a ecnetnes」を得る
2文全体を逆順にして「sentence a is This」を得る
ステップ1では、単語をどのように決定するかが重要です.ここでは、スペースを単語の境界とします.単語を見つけたら、上記の方法でこの単語を逆順にすることができます.すべての単語が逆順になった後、全体の文を1つの全体(すなわち、大きなスペースを含む単語)と見なしてもう一度逆順すればよい.下図に示すように、1行目は元の文字に置き換えられ、2行目は単語の逆順後の文字列で、最後の行は文全体の逆順後の文字列である.
参考資料:
文字列面接問題(一)文字列逆順
C++交換の2つの数のまとめ
この問題は比較的簡単で、方法もたくさんあります.ここで簡単にまとめて、参考にします.
プログラム1−プログラム4はいずれも比較的基本的な方法であり,プログラム5−プログラム8は比較的高度な方法である.
プログラム1
#include
#include
using namespace std;
int main()
{
string str,s = "";
cin>>str;
for(int i = 0;i
プログラム2#include
#include
#include
using namespace std;
int main(){
string ss;
while(getline(cin,ss)){
reverse(ss.begin(),ss.end());
cout<
プログラム3:#include
using namespace std;
int main() {
string str;
getline(cin,str);
int len = str.size();
int i = 0;
int j = len-1;
while(i < j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
cout<
プログラム4:#include
#include
using namespace std;
int main()
{
string s1;
while(getline(cin,s1))
{
for(int i=s1.length()-1;i>=0;i--)
{
cout<
プログラム5:char* Reverse(char* s)
{
// q
char* q = s ;
while( *q++ ) ;
q -= 2 ;
// , 。
char* p = newchar[sizeof(char) * (q - s + 2)] ;
char* r = p ;
//
while(q >= s)
*p++ = *q-- ;
*p = '\0' ;
return r ;
}
プログラム6:原地逆序(in-place reverse)これは最もよく考えられ、原地逆序は余分な分配空間を許さないことを意味し、主に以下のいくつかの方法があり、思想があまり悪くなく、文字列の両側の文字を1つずつ交換することであり、以下の図である.与えられた文字列「abcdef」は、逆シーケンスのプロセスが、それぞれ、交換文字aおよびf、交換文字bおよびe、交換文字cおよびdである.2つのポインタを設定して、文字列の頭と尾を指し、2つのポインタが指す文字を交換し、交差するまでポインタを中間に移動します.
char* Reverse(char* s)
{
// p
char* p = s ;
// q
char* q = s ;
while( *q )
++q ;
q -- ;
// , p q
while(q > p)
{
char t = *p ;
*p++ = *q ;
*q-- = t ;
}
return s ;
}
プログラム7:再帰的な方法// s left right ,
void Reverse( char* s, int left, int right )
{
if(left >= right)
return;
char t = s[left] ;
s[left] = s[right] ;
s[right] = t ;
Reverse(s, left + 1, right - 1) ;
}
プログラム8:異種または操作// s
char* Reverse(char* s)
{
char* r = s ;
// p
char* p = s;
while (*(p + 1) != '\0')
++p ;
//
while (p > s)
{
*p = *p ^ *s ;
*s = *p ^ *s ;
*p = *p-- ^ *s++ ;
}
return r ;
}
拡張:単語の逆順序
文字列が与えられ、単語ごとに文字列が逆順序になり、例えば「This is a sentence」が与えられた場合、出力は「sentence a is This」であり、問題を簡略化するために文字列には句読点が含まれない.
2段階に分ける
1単語の逆順で「sihT si a ecnetnes」を得る
2文全体を逆順にして「sentence a is This」を得る
ステップ1では、単語をどのように決定するかが重要です.ここでは、スペースを単語の境界とします.単語を見つけたら、上記の方法でこの単語を逆順にすることができます.すべての単語が逆順になった後、全体の文を1つの全体(すなわち、大きなスペースを含む単語)と見なしてもう一度逆順すればよい.下図に示すように、1行目は元の文字に置き換えられ、2行目は単語の逆順後の文字列で、最後の行は文全体の逆順後の文字列である.
// p q
void ReverseWord(char* p, char* q)
{
while(p < q)
{
char t = *p ;
*p++ = *q ;
*q-- = t ;
}
}
//
char* ReverseSentence(char* s)
{
//
char* p = s ; //
char* q = s ; // '\0'
while(*q != '\0')
{
if (*q == '')
{
ReverseWord(p, q - 1) ;
q++ ; //
p = q ;
}
else
q++ ;
}
ReverseWord(p, q - 1) ; //
ReverseWord(s, q - 1) ; //
return s ;
}
参考資料:
文字列面接問題(一)文字列逆順
C++交換の2つの数のまとめ