偶然看到cppblog精華區(qū)有一篇關(guān)于貌似是一道中興筆試題的代碼,文章請(qǐng)見
這里
個(gè)人覺得寫得不是很有美感,正好又很無聊,于是在這位的代碼基礎(chǔ)上改了下算法:
0、原作者可能沒有注意到他用的atoi庫(kù)函數(shù)的某些特點(diǎn);
1、充分利用atoi庫(kù)函數(shù)的特性:原地可解析字符串,不必拷貝出來;
2、由于atoi這個(gè)庫(kù)函數(shù)相當(dāng)于已經(jīng)實(shí)現(xiàn)了整數(shù)的前綴匹配,只要匹配從非數(shù)字到數(shù)字那一狀態(tài)就可以了;
3、完全沒必要給臨時(shí)分配的數(shù)組初始化值,因?yàn)橛衖ndex.
VS2008和DevC++下通過測(cè)試。
1
#include <iostream>
2
#include <algorithm>
3
void output(char* str,int len)
4

{
5
if(str==NULL||len<= 0)
6
return;
7
8
int * numList=new int[len],index=0,i;
9
char * isDigit=new char[len];//isDigit[i]存儲(chǔ)著:str[i]是否為數(shù)字
10
for(i=0;(i!=len)
11
&&(isDigit[i]=(str[i]<='9'&&str[i]>='0'),1);i++);//建立isDigit數(shù)組目的是避免重復(fù)運(yùn)算
12
13
if(isDigit[0]!=0)//避免取到isDigit[-1]
14
numList[index++]=atoi(str);
15
for(i=1;i!=len;i++)
16
if(isDigit[i-1]==0&&isDigit[i]!=0)//若是從上一個(gè)非數(shù)字字符跳到現(xiàn)在的數(shù)字字符,則從此處轉(zhuǎn)換一次整數(shù)到numList列表
17
numList[index++]=atoi(str+i);
18
19
std::sort(numList,numList+index);//排序
20
std::copy(numList,numList+index,
21
std::ostream_iterator<int>(std::cout," "));
22
delete [] numList;
23
delete [] isDigit;
24
}
25
int main()
26

{
27
char input[] = "33k&99+r5sw1f10gd4vc511gc3";
28
output(input,strlen(input));
29
return 0;
30
}
為了榨取性能和空間,我進(jìn)一步改得略微丑陋了些,但某些地方改得更美觀- -bnr:
#include <iostream>
#include <algorithm>
void output(char* str,int len)


{
if(str==NULL||len<= 0)
return;
int * numList=new int[len],index=0,i;
bool * isDigit=new bool[len];//isDigit[i]存儲(chǔ)著:str[i]是否為數(shù)字
for(i=0;i != len;i++)//建立isDigit數(shù)組目的是避免重復(fù)運(yùn)算
isDigit[i] = str[i]<='9'&&str[i]>='0';

if(*isDigit++ != 0)//避免取到isDigit[-1]
numList[index++] = atoi(str++);
for(;*str !=0 ;++str,++isDigit)
if(!*(isDigit-1)&& *(isDigit))//若是從上一個(gè)非數(shù)字字符跳到現(xiàn)在的數(shù)字字符,則從此處轉(zhuǎn)換一次整數(shù)到numList列表
numList[index++] = atoi(str);

std::sort( numList , numList+index);//排序
for(i=0;i != index;++i)
std::cout<<numList[i]<<" ";
delete [] numList;
delete [] (isDigit-len);
}
int main()


{
char input[] = "33k&99+r5sw1f10gd4vc511gc3";
output(input,strlen(input));
return 0;
}