深圳某名企招聘程序员面试题!!!

cheniwantyou 2007-04-25 08:28:30
有两个数组,现在要求输入一串二进制数字,输入的格式为"子二进制串再末尾加个#号"(子二进制串必须符合data数组中的形式中的一种).
例如:从控制台中输入 0001#1110#01# (输入回车键结束)
然后通过程序输出匹配的字母串: acf
const int n=8;
char character[n]=
{
'a','b','c','d','e','f','g','h'
};
char* data[n]=
{
"0001","10","1110","1111",
"110","01","0000","001"
};
问题的基本上是这样的。请问要怎么编写程序解决啊?(用C++)
...全文
1605 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
deng2000 2007-04-26
  • 打赏
  • 举报
回复
这段时间在看boost, 因此用boost库写了一个,纯属好玩.

#include <boost/spirit/core.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <string>
#include <map>

using namespace std;
using namespace boost::spirit;
using namespace boost;

// helper function for ExtractString
void AddString(char const *first, char const *last, vector<string>& vecStr)
{
string s(first, last);
vecStr.push_back(s);
}


// extract (0|1)* from pr and save to vecString
void ExtractString(const char *pr, vector<string>& vecString)
{
rule<> r = (+(ch_p('0') | '1'))[bind(AddString, _1, _2, ref(vecString))];
parse(pr, r >> *('#' >> r) ); // get strings seperated by '#'
}

const int n=8;

char character[n]=
{
'a','b','c','d','e','f','g','h'
};

char* data[n]=
{
"0001","10","1110","1111",
"110","01","0000","001"
};

// translate based on character[] and data[]
string Translate(const char *pStr)
{
// create map
map<string, char> map1;
for (int i=0; i<n; i++)
map1[data[i]] = character[i];

// extrace strings
vector<string> vecString;
ExtractString(pStr, vecString);

// do translation
string sResult = "";
for (vector<string>::const_iterator ii=vecString.begin(); ii!=vecString.end(); ++ii)
{
char ch = map1[*ii];
if (ch!=0)
sResult += ch;
}
return sResult;
}

int main()
{
// just for test
string sResult = Translate("0001#1110#01#");
cout << sResult << endl;
return 0;
}
zxg623 2007-04-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
const int n=8;
char character[n]=
{
'a','b','c','d','e','f','g','h'
};
char* data[n]=
{
"0001","10","1110","1111",
"110","01","0000","001"
};
int main()
{
char *str="0001#1110#01#";
//cin>>str;
while (*str!='\0')
{
char s[20];
int i=0;
while (*str!='#')
{
s[i]=*str;
str++;
i++;

}
s[i]='\0';
for (int j=0;j<n;j++)
{
if (strcmp(s,data[j])==0)
{
cout<<character[j];
break;
}
}
str++;
}
return 0;
}
banzhiyu 2007-04-26
  • 打赏
  • 举报
回复
用map简单写了下,有哪里不对,请高手指正。
#include <iostream>
#include <stdlib.h>
#include <string>
#include <map>

using namespace std;

int main(int argc, char *argv[])
{
map<string,char>word;
map<string,char>::iterator it;
word[string("0001")]='a';
word[string("10")]='b';
word[string("1110")]='c';
word[string("1111")]='d';
word[string("110")]='e';
word[string("01")]='f';
word[string("0000")]='g';
word[string("001")]='h';

string s,temp;
char ch;
cout<<"输入字符串:";
cin>>s;
int j=-1;
int pos=s.find("#");
while(pos!=-1){
temp=s.substr(j+1,pos-j-1);
it=word.find(temp);
if(it!=word.end())
ch=(*it).second;
cout<<ch;
j=pos;
pos=s.find_first_of('#',j+1);
}
temp=s.substr(j+1,s.size()-j-1);
it=word.find(temp);
if(it!=word.end())
ch=(*it).second;
cout<<ch;

system("PAUSE");
return 0;
}
jzp12 2007-04-26
  • 打赏
  • 举报
回复
来个简单的吧!其实也没有必要把它们分开的,但是为了规范起见,另外如果你对const不熟悉的话,你可以完全把程序的中所以const去掉,不影响功能实现,不过前辈们常说,能用const的
地方就尽量用,当然前提是你得知道那些地方不能用。
----------------
//ClassTest.h
class ClassTest
{
public:
void FindWord (char* inputstring, const char character[], const char* data[]) const;
};
---------------
//ClassTest.cpp

void ClassTest::FindWord (char inputstring[], const char character[], const char* data[]) const
{
char TempStore[4];
int j = 0;
for(int i=0; i<strlen(inputstring); i++)
{
if(inputstring[i] != '#')
{
TempStore[j++] = inputstring[i];
continue;
}
else
{
TempStore[j] = '\0';//这一步不可少.
for(int k=0; k<8; k++)
{
if((strcmp(TempStore,data[k]) == 0))
{
cout << character[k];
}
}
j = 0;
}
}
cout << endl;
}
----------------
//main.cpp
const int M = 20;
const int n=8;

int main()
{

char InputString[M];
const char character[n]={'a','b','c','d','e','f','g','h'};
const char* data[n]={"0001","10","1110","1111","110","01","0000","001"};

cout << "请输入字符串:" <<endl;
cin >> InputString;
ClassTest test;
test.FindWord (InputString, character, data);

return 0;
}
----------------
qxbnit 2007-04-26
  • 打赏
  • 举报
回复
这题应该考的不是字符串解析吧?

我想应该是huffman编码,才配得上你说的"名企",^_^~~ 呵呵~~
Just4life 2007-04-26
  • 打赏
  • 举报
回复
map很轻松就可以实现
cheniwantyou 2007-04-26
  • 打赏
  • 举报
回复
仰慕yzhg2007() 先生...厉害啊!
cheniwantyou 2007-04-26
  • 打赏
  • 举报
回复
boost库的那代码看了都晕,在VC6.0也编译不过。找不到第一个头文件.
IT_zen 2007-04-26
  • 打赏
  • 举报
回复
太难了
yzhg2007 2007-04-26
  • 打赏
  • 举报
回复
#include <iostream>
#include <string.h>


void GetDestString(const char *pszSrcStr, char *pszDestStr);
bool GetRelevantStr(const char *pszStr, int nPos, char *pFindStr);
char GetDestChar(const char *pszStr);

const int n=8;
char character[n]=
{
'a','b','c','d','e','f','g','h'
};
char* data[n]=
{
"0001","10","1110","1111", "110","01","0000","001"
};

using namespace std;


void main()
{
char szInputStr[1024] = {0};
char szResultStr[1024] = {0};
cout<<"pls input a string\n-->";
cin>>szInputStr;

GetDestString(szInputStr, szResultStr);
cout<<"\n valid result ="<<szResultStr<<endl;
}

void GetDestString(const char *pszSrcStr, char *pszDestStr)
{
char *pch = pszDestStr;
int nPos = 0;
char szFindStr[1024];
while(GetRelevantStr(pszSrcStr, nPos, szFindStr))
{
char ch = GetDestChar(szFindStr);
if (ch != '\0')
{
*pch = ch;
pch++;

cout<<"\n param ("<<nPos<<"): "<<szFindStr<<"<---->"<<ch<<endl;
}
else
{
cout<<"\n param ("<<nPos<<"): "<<szFindStr<<"<---->"<<"not found."<<endl;
}


nPos++;
}
pch = '\0';
}

//if the elem is not found, then return false
bool GetRelevantStr(const char *pszStr, int nPos, char *pFindStr)
{
if (nPos < 0
|| pszStr == NULL
|| strlen(pszStr) <= 0
|| pFindStr == NULL
)
{
return false;
}

const char *pch = pszStr;
char *pReturnStr = pFindStr;
int nFlag = 0;

while(*pch != '\0')
{
if (nFlag == nPos) //start copy
{
while(*pch != '\0' && *pch != '#')
{
*pReturnStr = *pch;
pch++;
pReturnStr++;
}
*pReturnStr = '\0';
return true;
}

if (*pch == '#')
{
nFlag++;
}

pch++;
}

return false;
}

char GetDestChar(const char *pszStr)
{
for (int i = 0; i < 8; i++)
{
if (strcmp(pszStr, data[i]) == 0)
{
return character[i];
}
}

return '\0';
}
cheniwantyou 2007-04-26
  • 打赏
  • 举报
回复
zxg623(蓝色的梦)的代码我修改如下:(只修改了输入的部分)这样基本上就能输出正确的编码,但是还是会跳出对话框说“遇到问题需要关闭”。
----------------------------------------
运行情况如下:
请输入编码长度: 20
请输入编码: 0001#10#1110#1111#110#01#0000#
abcdPress any key to continue
----------------------------------------
但是我这样改会出现数据冗余,不能处理全部的输入.请问如果只修改下面的代码要怎么做?
----------------------------------------
另外我想问一下:map是什么?我是初学者,水平太低,不懂.

----------------------------------------
#include <iostream>
using namespace std;
const int n=8;
char character[n]=
{
'a','b','c','d',
'e','f','g','h'
};
char* data[n]=
{
"0001","10","1110","1111",
"110","01","0000","001"
};
int main()
{
int o;
char *str;
cout<<"请输入编码长度: ";
cin>>o;
char *sd=new char[o];
str=sd;
cout<<"请输入编码: ";
for(int i=0;i<o;i++)
cin>>sd[i];
while (*str!='\0')
{
char s[20];
int i=0;
while (*str!='#')
{
s[i]=*str;
str++;
i++;

}
s[i]='\0';
for (int j=0;j<n;j++)
{
if (strcmp(s,data[j])==0)
{
cout<<character[j];
break;
}
}
str++;
}
cout<<endl;
return 0;
}


yoyo_alex_lw 2007-04-26
  • 打赏
  • 举报
回复
map最好处理了。
cheniwantyou 2007-04-26
  • 打赏
  • 举报
回复
zxg623(蓝色的梦)的代码如果该成又cin输入的时候会出现异常.无显示输出.
cheniwantyou 2007-04-26
  • 打赏
  • 举报
回复
感谢各位高手相助!
ff5dq4 2007-04-26
  • 打赏
  • 举报
回复
map 轻松搞顶
h9999h 2007-04-25
  • 打赏
  • 举报
回复
//大概差不多,看看吧。
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

const int n=8;
char character[n]=
{
'a','b','c','d','e','f','g','h'
};
char* data[n]=
{
"0001","10","1110","1111",
"110","01","0000","001"
};


using namespace std;

bool equalIf( const char& a)
{
if( a == '#')
return true;
else
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
string instr;
getline(cin, instr);
replace_if( instr.begin(), instr.end(), equalIf ,' ');//替换掉"#"
stringstream ss(instr);
while( !ss.eof() )
{
string str;
ss >> str;
for( int i = 0; i < n; ++i )
{
if( str == data[i] )
{
cout << character[i];
}
}
}
cout << endl;
return 0;
}

Baku 2007-04-25
  • 打赏
  • 举报
回复
可以用map 匹配

64,648

社区成员

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

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