晒一个C++面试题

ShineShineRedStar 2010-03-19 03:55:55
写一个函数,形如 int decode(string){} 将中文里对数字的描述转化成int输出。
分别用“sbqwy”表示中文里的“十百千万亿”,如输入一个“3q7b6s2”输出3762.只有20分钟,你能写出什么样的程序呢。
...全文
632 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuccty 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vincent_1011 的回复:]
想想自己也要找工作。所以试了下。汗。思路一开始就有了。不过自己用电脑写了下。加个调试下30分钟才弄出来。哈。。。。有点紧张。。别对代码风格有意思,这是想到哪就定义变量出来的。试下好不好使

C/C++ code

char pchar[]="2w3q7b6s2";
int i=strlen(pchar);
unsigned long num=0;
int z=-1;
ULONG ……
[/Quote]

考虑下用switch吧,一长串的IF看着难受。
ShineShineRedStar 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 player1005 的回复:]

很奇怪,你们贴代码之前不做任何测试吗?
有很多代码有明显问题.有些连=和==都弄错了...
C/C++ code

#include <stdio.h>
#include <assert.h>
#include <ctype.h>

/*
** 功能:返回字符ch对应的数字,
** 输入ch必须为digit,否则结果未知
** 返回:对应的数字
*/
char CharToDig……
[/Quote]这个好。
zhu_nn 2010-03-20
  • 打赏
  • 举报
回复
int decode(string m_string)
{
int sum=0;
int temp = 0;
int j = m_string.size()-1;
for (int i=0;i< j;i++)
{
if (m_string[i]>=48 && m_string[i] <=57)
{
temp = m_string[i] - 48;
}
i++;
switch (m_string[i])
{
case 's':
sum +=temp*10;
break;
case 'b':
sum +=temp*100;
break;
case 'q':
sum +=temp*1000;
case 'w':
sum +=temp*10000;
break;
case 'y':
sum +=temp*1000000000;
break;
default:
break;
}
}
sum += (m_string[j]-48);
return sum;
}

输入的string必须是合格格式的
xiuxianshen 2010-03-20
  • 打赏
  • 举报
回复
或者做个结构
struct _XX
{
int number;
char str[];
bool flag;
}
根据结构的标记来输出_XX.number和_XX.str就可以了啊
xiuxianshen 2010-03-20
  • 打赏
  • 举报
回复
建个字符串数组,然后对应位不为零就做个标记,根据标记将数字和字符数字挨个轮流输出就是了
xhp718 2010-03-20
  • 打赏
  • 举报
回复
就是特殊情况有点难处理
ShineShineRedStar 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 jbz001 的回复:]

或者输入“三百四千二十五万六十八千百”怎么办???
[/Quote]假定输入是合理的。而且像你这种输入,你期待的输出是什么呢?
jbz001 2010-03-20
  • 打赏
  • 举报
回复
或者输入“三百四千二十五万六十八千百”怎么办???
jbz001 2010-03-20
  • 打赏
  • 举报
回复
如果输入“三百四千二十五”,怎么办???
ShineShineRedStar 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 blackfacewa 的回复:]

参加笔试的嘛哈哈
怎么测试啊?
[/Quote]呵呵,是上机的呢。
blackfacewa 2010-03-20
  • 打赏
  • 举报
回复
参加笔试的嘛哈哈
怎么测试啊?
Player1005 2010-03-20
  • 打赏
  • 举报
回复
很奇怪,你们贴代码之前不做任何测试吗?
有很多代码有明显问题.有些连=和==都弄错了...

#include <stdio.h>
#include <assert.h>
#include <ctype.h>

/*
** 功能:返回字符ch对应的数字,
** 输入ch必须为digit,否则结果未知
** 返回:对应的数字
*/
char CharToDigit(char ch)
{
return (ch-'0');
}

/*
** 功能:对字符串str中的中文描述数字方式转换为数字并返回.
*/
unsigned long decode(const char *str)
{
unsigned long ldat = 0; //存储转换后的值,进行累加,并且返回该值
unsigned long datTmp = 0; //存储中间在乘以万或者亿之前的值
char nTmp = 0; //存储读入的单个数字

char *pTmp = (char *)str;

assert(str != NULL);

while(*pTmp != '\0')
{
if (isdigit(*pTmp)) //处理数字
{
nTmp = CharToDigit(*pTmp);
pTmp++;
if ((*pTmp == 'w') || (*pTmp == 'y') || (*pTmp == 0)) //如果下一位为万亿或者最后的个位,将数字加到临时的个位上
{
datTmp += nTmp;
}
continue;
}

switch (*pTmp)
{
case 's': //十
datTmp += nTmp * 10;
break;
case 'b': //百
datTmp += nTmp * 100;
break;
case 'q': //千
datTmp += nTmp *1000;
break;
case 'w': //万
ldat += datTmp * 10000;
datTmp = 0;
break;
case 'y': //亿
ldat += datTmp * 100000000;
datTmp = 0;
break;
default:
printf("\n input error! \n");
break;
}
pTmp++;

}
ldat += datTmp;
return ldat;
}


int main(int argc, char* argv[])
{
printf("\n %d \n",decode("1s1y3q2sw5q6b3s4"));
return 0;
}
ShineShineRedStar 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 shineshineredstar 的回复:]
写一个函数,形如 int decode(string){} 将中文里对数字的描述转化成int输出。
分别用“sbqwy”表示中文里的“十百千万亿”,如输入一个“3q7b6s2”输出3762.只有20分钟,你能写出什么样的程序呢。
[/Quote]可以用以下的一些测试用例:
2s->20;
8q08->8008;
2sw7q6b3s7->207637;
1s3y7q6bw05b->1376000500;
...
SammyLan 2010-03-20
  • 打赏
  • 举报
回复
 int Atoi(char *str)
{
static char strArrBase['z'-'a'+2]={0};
static int iArrBase[]={1,10,100,1000,10000,100000000};
strArrBase['s'-'a']=1;
strArrBase['b'-'a']=2;
strArrBase['q'-'a']=3;
strArrBase['w'-'a']=4;
strArrBase['y'-'a']=5;
int sum = 0;
int i=0;
bool bCalc = false;
while(*str!='\0')
{
if (*str>='0'&&*str<='9')
{
i = *str -'0';
}
else
{
sum += i* iArrBase[strArrBase[*str - 'a']];
i=0;
}
++str;
}
sum+=i;
return sum;
}


思路是这样,自己做一下容错性和优化处理吧
这里是将4b4当作404处理的
而且不支持4b04这种输入格式,但是要改成这格式也很简单
niejimaoo 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 benbshmily 的回复:]
C/C++ code
int fun(const char *str)
{
int num = 0, sum = 0;
while (*str != '\0')
{
char ch = *str;
if (ch >= '0'&& ch <= '9')
{
……
[/Quote]
顶这个,思路很明了
zhzh1126 2010-03-19
  • 打赏
  • 举报
回复
wo de shuiping hen cdai
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
我慢慢写的程序,这个程序最难的大概就是20分钟的时限吧
#include <iostream>
using namespace std;

int analyze(string s)
{
int reVal = 0;
int temp=0;
int tens = 1;
bool isInt = false;
for(int i =0; i<(int)(s.length());i++)
{

if(s[i]>='0'&&s[i]<='9')
{
temp= s[i]-(int)'0';
isInt = true;
}
else
{
switch (s[i])
{
case 's':
tens = 10;
isInt = false;
break;
case 'b':
tens = 100;
isInt = false;
break;
case 'q':
tens = 1000;
isInt = false;
break;
default:
tens = 1;
break;
}
temp *= tens;
}

if(!isInt||i==(int)(s.length()-1))

reVal+=temp;
}
return reVal;
}

int decode (string s)
{
int reVal = 0;
string ys, ws, gs=s;
bool isYcontained = false;
bool isWcontained = false;
int yPosition = 0;
int i=0;
while(s[i]!='\0')
{
if(s[i]=='y')
{
isYcontained = true;
yPosition = i;
ys = s.substr(0,yPosition);
gs = s.substr(i);
}

if(s[i] =='w')
{
isWcontained = true;
ws = s.substr(yPosition,i-yPosition);
gs = s.substr(i+1);
}
i++;
}
reVal = analyze(gs);
if(isYcontained)
{
reVal += analyze(ys)*100000000;
}

if(isWcontained)
{
reVal +=analyze(ws)*10000;
}
return reVal;
}
int main()
{
cout <<decode("1s2")<<"\n"<<decode("1s3w")<<"\n"<<decode("2sw2q")<<"\n"<<decode("4b03")<<"\n"<<decode("4b3s")<<"\n"<<decode("1s2y9b2sw8q9s");
system("pause");
return 0;
}
kivenanlice 2010-03-19
  • 打赏
  • 举报
回复
/*写一个函数,形如 int decode(string){} 将中文里对数字的描述转化成int输出。
分别用“sbqwy”表示中文里的“十百千万亿”,如输入一个“3q7b6s2”输出3762.只有20分钟,你能写出什么样的程序呢。
*/

int decode( string str )
{
int ret = 0;
int nPriDigit = 0;
int nPriUnit = 1;
for( int i = 0 ;i < str.length(); i++)
{
char cUnit = str.at(i);
if( cUnit >= '0' && cUnit <='9' )
{
nPriDigit = cUnit - '0';
}
else
{
int nUnit = 0;
switch( cUnit )
{
case 's':
nUnit = 10;
break;
case 'b':
nUnit = 100;
break;
case 'q':
nUnit = 1000;
break;
case 'w':
nUnit = 10000;
break;
case 'y':
nUnit = 100000000;
break;
default:
break;
}
if( nPriUnit != 0 && nUnit > nPriUnit )
ret *= nUnit;
ret += nPriDigit * nUnit;
nPriUnit = nUnit;
nPriDigit = 0;
}
}
ret += nPriDigit;
return ret;
}



int main(int argc, char *argv[])
{
string str = "7b2s5wl5bl3";
cout << decode(str) << endl;
system("PAUSE");
return 0;
}
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 forster 的回复:]

四百三
代表430还是403?
[/Quote]430的话就是4b3s,403的话就是4b03
happynxy 2010-03-19
  • 打赏
  • 举报
回复
下班前赶集:
typedef struct __CharWeight {
char c;
int weight;
} CharWeight;

const CharWeight gCharWeightTable[] = {
{ 'y', 10000*10000 },
{ 'w', 10000 },
{ 'q', 1000 },
{ 'b', 100 },
{ 's', 10 },
{ '\0', 1}
};

int findWeight(char c)
{
static int iloop = 0; // 强制按数量级从大到小排列

while( gCharWeightTable[iloop].c!='\0' && gCharWeightTable[iloop].c!=c )
++iloop;

return gCharWeightTable[iloop].weight;
}

int decode(const char* str)
{
const char *next = str;
int field_value = 0;
int final_value = 0;
int sign = 1;

if( *next=='-' ) // 支持负数
{
sign = -1;
++next;
}

while( *next!='\0' )
{
while( *next>='0' && *next<='9' ) // 得到一个field
{
field_value += 10*field_value + (*next-'0');
++next;
}

final_value += field_value*findWeight(*next);
field_value = 0;

if( *next )
++next;
}

final_value *= sign;

return final_value;
}
加载更多回复(24)

65,190

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧