您的位置:首页 > 其它

2015华为校园招聘机试模拟题及解答

2014-09-03 21:07 309 查看
1、模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用“A”、”B”、”C”、”D”表示,选举时开始计票, 若输入的不是“A”、”B”、”C”、”D”则视为无效票。选举结束后获取各个候选人的得票数以及无效票的个数,输出结果以添加候选人的顺序进行顺序输出,最后一行为无效的数量。同时getVoteResult命令为结束命令。

输入为多行形式输入,每一行为一条命令。输入的命令只会是有效命令且不存在非法命令,但可能存在非法的投票,上面已经描述了。

添加候选人的命令如下:addCandidate为命令 xx1为候选人:addCandidate xx1

投票的命令如下:vote为命令 xx1为候选人的字符串:vote xx1

统计投票的命令如下:getVoteResult为命令:getVoteResult

void main()
{
std::string commond;
std::string add = "addCandidate";
std::string vote = "vote";
std::string getResult = "getVoteResult";
std::cin>>commond;
std::map<std::string,int> voteResult;
std::vector<std::string> candidate;
int useless = 0;
while(commond != getResult)
{
if(commond == add)
{
std::cin>>commond;
voteResult.insert(std::make_pair(commond,0));
candidate.push_back(commond);
}
if(commond == vote)
{
std::cin>>commond;
if(voteResult.count(commond) != 0)
voteResult[commond]++;
else
useless++;
}
std::cin>>commond;
}
std::vector<std::string>::iterator iter = candidate.begin();
while(iter != candidate.end())
{
std::string can = *iter;
std::cout<<can<<" "<<voteResult.find(can)->second<<std::endl;
iter++;
}
std::cout<<useless<<std::endl;
//system("pause");
}
2、描述:输入一串数字,找到其中包含的最大递增数。递增数是指相邻的数位从小到大排列的数字。如: 2895345323,递增数有:289,345,23, 那么最大的递减数为345。运行时间限制:无限制内存限制:无限制输入:输入一串数字,默认这串数字是正确的,即里面不含有字符/空格等情况输出:输出最大递增数样例输入:123526897215样例输出:2689
bool isLarger(std::string first,std::string second)
{
int firstLen = first.length();
int secondLen = second.length();

if(firstLen != secondLen)
return firstLen > secondLen;
else
{
int i = 0;
while(i < firstLen && first.at(i) == second.at(i))
++i;
if(i < firstLen)
return first.at(i) > second.at(i);
else
return false;
}
}
void main()
{
std::string number;
std::cin>>number;
int length = number.length();
std::string maxNum = "0";
int start = 0;
int end = 0;
for(int i = 1; i < length;++i)
{
while(i < length && number.at(i) > number.at(i -1))
i++;

end = i - 1;
std::string subStr = number.substr(start,end - start + 1);
if(isLarger(subStr,maxNum))
{
maxNum = subStr;
}
start = i;
end = i;
}
std::cout<<maxNum<<std::endl;
//system("pause");
}
在n*m字符迷宫中寻找指定单词,单词需在迷宫中连续出现,存在返回YES,否则返回NO,
bool foundWord(char* matrix,int n,int m,int i, int j,std::string words,int k)
{
if(k == words.length())
return true;
if(i - 1 > -1)
{
if(*(matrix + (i-1) * m + j) == words.at(k))
{
return foundWord(matrix,n,m,i - 1,j,words,k + 1);
}
}
if(i + 1 < n)
{
if(*(matrix + (i+1) * m + j) == words.at(k))
{
return foundWord(matrix,n,m,i + 1,j,words,k + 1);
}
}
if(j - 1 > -1)
{
if(*(matrix + i * m + j - 1) == words.at(k))
{
return foundWord(matrix,n,m,i,j - 1 ,words,k + 1);
}
}
if(j + 1 < m)
{
if(*(matrix + i * m + j + 1) == words.at(k))
{
return foundWord(matrix,n,m,i,j + 1,words,k + 1);
}
}
return false;
}
void main()
{
int n = 0;
int m = 0;
std::string words;
int length = words.length();
std::cin>>n>>m;
std::cin>>words;
char *matrix = new char[n * m];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
std::cin>>*(matrix + i * m + j);
}
}
int i = 0;
int j = 0;
bool found = false;

for(i = 0;!found && i < n; ++i)
{
for(j = 0; !found && j < m; ++j)
{
if(*(matrix + i * m + j) == words.at(0))
{
found = true;
}
}
}
if(!found)
{
std::cout<<"NO";
return;
}
if(foundWord(matrix,n,m,i,j,words,1))
std::cout<<"YES";
else
std::cout<<"NO";

system("pause");
}

上一个代码中存在一个明显的问题,就是假设首个字母出现多次的情形下,无法正常判断

typedef struct _position
{
int col;
int row;
_position()
{
col = -1;
row = -1;
}
_position(int r,int c)
{
row = r;
col = c;
}

}Position,*PositionPtr;

void main()
{
//新的思路,记录单词字母对应的矩阵下标,判断其是否连成链
//关键问题,如何进行存储,
//由于一个字符可能对应多个下标,选择使用multimap进行存储<key,value1><key,value2>
int n = 0;
int m = 0;
std::string words;
int length = words.length();
std::cin>>n>>m;
std::cin>>words;
std::multimap<char,Position> record;
typedef std::multimap<char,Position>::size_type map_size;
for(int i = 0; i < words.length(); i++)//记录所有字母
{
record.insert(std::make_pair(words.at(i),Position(-1,-1)));
}

char *matrix = new char[n * m];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
std::cin>>*(matrix + i * m + j);
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
map_size entries = record.count(*(matrix + i * m + j));//字符在multimap中的个数
if(entries != 0)
{
record.insert(std::make_pair(*(matrix + i * m + j),Position(i,j)));//记录单词字母在矩阵中的位置
}
}
}
//记录的位置<-1,-1>,<真实位置>
//对记录进行查找,并判断是否连续,如何进行判断
//使用栈操作,将多个可行节点入栈
std::pair<int,Position> stack[10];//int 是word中下标, Positiono下标字母对应坐标
int top = 0;//指向栈顶
map_size count = record.count(words.at(0));
std::multimap<char,Position>::iterator iter = record.find(words.at(0));
iter++;//首个为<-1,-1>
for(map_size cnt = 1; cnt != count; cnt++,iter++)
{
int col = iter->second.col;
int row = iter->second.row;
stack[top++] = std::make_pair(0,Position(row,col));
}

while(top != 0)//堆栈操作
{
std::pair<int,Position> cur = stack[--top];//栈顶元素输出
int index = cur.first;
if(index == words.length() - 1)//表示当前栈元素已经遍历到单词的尾端
{
std::cout<<"YES"<<std::endl;
system("pause");
return;
}
Position cur_pos = cur.second;

map_size count = record.count(words.at(index + 1));
std::multimap<char,Position>::iterator iter = record.find(words.at(index + 1));
iter++;
for(map_size cnt = 1; cnt != count; cnt++,iter++)
{
int col = iter->second.col;
int row = iter->second.row;
if(std::abs(col - cur_pos.col) + std::abs(row - cur_pos.row) == 1)//当前单词与上一单词邻近
stack[top++] = std::make_pair(index + 1,Position(row,col));
}
}
std::cout<<"NO"<<std::endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: