慕田峪7331174
2019-02-25 02:05:32
天梯賽的一道題,題目如下:
給定一個長度不超過10000的、僅由英文字母構(gòu)成的字符串。請將字符重新調(diào)整順序,按“GPLTGPLT....”這樣的順序輸出,并忽略其它字符。當然,四種字符(不區(qū)分大小寫)的個數(shù)不一定是一樣多的,若某種字符已經(jīng)輸出完,則余下的字符仍按GPLT的順序打印,直到所有字符都被輸出。
輸入格式:
輸入在一行中給出一個長度不超過10000的、僅由英文字母構(gòu)成的非空字符串。
輸出格式:
在一行中按題目要求輸出排序后的字符串。題目保證輸出非空。
輸入樣例:pcTclnGloRgLrtLhgljkLhGFauPewSKgt輸出樣例:GPLTGPLTGLTGLGLL
在csdn上面找到的別人用c++的做法,代碼如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
int G, P, L, T;
G = P = L = T = 0;
cin >> str;
for( int i = 0; i < str.size(); i++ ) {
switch( str[i] ) {
case 'g':
case 'G': G++; break;
case 'p':
case 'P': P++; break;
case 'l':
case 'L': L++; break;
case 't':
case 'T': T++; break;
}
}
while( G || P || L || T ) {
if( G ) { cout << "G"; G--; }
if( P ) { cout << "P"; P--; }
if( L ) { cout << "L"; L--; }
if( T ) { cout << "T"; T--; }
}
return 0;
}
我發(fā)現(xiàn)好像大部分有關字符串的問題都可以用字符數(shù)組來接收,比如:
char a[10005];
char b[10005];
gets(a);
gets(b);
這小段代碼里面,定義了字符數(shù)組,但是卻用輸入整個字符串的方式來讀入的(這小段代碼是別的程序里面的)上面那個完整的代碼,不明白的地方又兩處:1.定義的字符串str,卻可以當做字符數(shù)組來用2.while循環(huán)里里為什么可以直接判斷?
請問這里面的實現(xiàn)是否和內(nèi)存存儲方式有關,java中會有類似的實現(xiàn)機制嗎?
4 回答

呼喚遠方
TA貢獻1856條經(jīng)驗 獲得超11個贊
C/C++ 與 Java 的不同就是,C/C++ 的任何字符串類本質(zhì)上都是對 C 風格字符串即 char 數(shù)組的包裝,而且這個 char 數(shù)組仍嚴格要求必須額外儲存一個尾 0 字符 (不是字符 '0')。這是由 C 最初設計字符串的方式?jīng)Q定的,C 的字符串就以字符數(shù)組的形式實現(xiàn),其中末尾必須包含一個 0 字符作為結(jié)束符。不像 Java 設計之初就是通過長度來確定 String 對象的長度,其不需要尾 0 字符。所以,遍歷一個字符串也可以用非 0 的循環(huán)進行判斷。
int i = 0;
while ( str[i] ) {
char c = str[i++];
switch ( c ) {
//
}
}
for ( int i = 0; str[i] != 0; i++ ) {
char c = str[i];
switch ( c ) {
//
}
}
如上面其他幾位所說,這些類提供了 [] 重載,使得你通過下標可以遍歷 string 類內(nèi)部的字符數(shù)組。Java 打印任何對象,包括 String,都調(diào)用了其 toString() 方法。C/C++ 打印字符串的方式和最初 C 設計字符串的方式一樣,從字符指針開頭開始,逐個字符打印,直到遇到 0 字符方才結(jié)束。
第二個問題,C/C++ 的 while、if 等可以將任何數(shù)值,包括指針,隱式轉(zhuǎn)換為 bool。
添加回答
舉報
0/150
提交
取消