http://blog.csdn.net/dalianmaoblog/article/details/11477997
题目来源于http://blog.csdn.net/hackbuteer1/article/details/11132567。
后面的代码是今天早上才写的,C++好长时间不写了,一些简单的函数都是上网查的用法,如果要我现场写,估计很悬。
华为2014校园招聘的机试题目和2013年的完全一样。
一、题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
- void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){
- map<char,int> charMap;
- int k=0;
- for(int i=0;i<lInputLen;i++){
- if(charMap.find(*(pInputStr+i))==charMap.end()){
- *(pOutputStr+k++)=*(pInputStr+i);
- charMap.insert(pair<char,int>(*(pInputStr+i),1));
- }
- }
- *(pOutputStr+k++)='\n';
- }
二、题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
- void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){
- int k=0;
- for(int i=0;i<lInputLen;i++){
- int num=1;
- int j=i+1;
- for(;j<lInputLen;j++){
- if(pInputStr[j]==pInputStr[i]){
- num++;
- }else{
- break;
- }
- }
- if(num!=1){
- char str[100];
- sprintf(str,"%d",num);
- strcpy(pOutputStr+k,str);
- k = k+strlen(str);
- }
- *(pOutputStr+k++)=*(pInputStr+i);
- i = j-1;
- }
- *(pOutputStr+k++)='\n';
- }
三、题目描述(50分):
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
- bool isOperater(char* c){
- char f[]="+-*/";
- if(c==NULL||strlen(c)!=1){
- return false;
- }
- for(int i=0;i<strlen(f);i++){
- if(f[i]==*c)
- return true;
- }
- return false;
- }
- bool isNumber(char* c,int& num){
- if(c==NULL||strlen(c)<=0){
- return false;
- }
- for(int i=0;i<strlen(c);i++){
- if(c[i]>'9'||c[i]<'0')
- return false;
- }
- num = atoi(c);
- return true;
- }
- struct data{
- public:
- bool isNum;
- union{
- char operater;
- int number;
- }u;
- };
- void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr){
- stack<data> Stack;
- const char *d = " ";
- char s[256];
- strcpy(s,pInputStr);
- char *p;
- int num;
- p = strtok(s,d);
- while(p){
- if(isOperater(p)){ //是操作符
- if(Stack.size()<1){
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }else{
- data data1= Stack.top();
- if(data1.isNum){ //栈顶元素是数字
- data data2;
- data2.isNum = false;
- data2.u.operater=*p;
- Stack.push(data2);
- }else{//栈顶元素是操作符
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- }
- }else if(isNumber(p,num)){ //是数字
- if(Stack.size()<1){
- data data1;
- data1.isNum = true;
- data1.u.number=num;
- Stack.push(data1);
- }else{
- data data1= Stack.top();
- if(data1.isNum){ //栈顶元素是数字
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }else{//栈顶元素是操作符
- Stack.pop();
- data data2 = Stack.top();
- Stack.pop();
- if(!data2.isNum){
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- int num2 = data2.u.number;
- int num3 = 0;
- switch(data1.u.operater){
- case '+':
- num3=num2+num;
- break;
- case '-':
- num3=num2-num;
- break;
- case '*':
- num3=num2*num;
- break;
- case '/':
- num3=num2/num;
- break;
- default:
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- data data3;
- data3.isNum=true;
- data3.u.number=num3;
- Stack.push(data3);
- }
- }
- }else{
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- p=strtok(NULL,d);
- }
- if(Stack.size()==1){
- data d = Stack.top();
- if(d.isNum){
- sprintf(pOutputStr,"%d",d.u.number);
- return;
- }
- }
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
整个源码:
- //============================================================================
- // Name : huaweijishi.cpp
- // Author :
- // Version :
- // Copyright : Your copyright notice
- // Description : Hello World in C++, Ansi-style
- //============================================================================
- #include <iostream>
- #include <map>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <stack>
- using namespace std;
- void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){
- map<char,int> charMap;
- int k=0;
- for(int i=0;i<lInputLen;i++){
- if(charMap.find(*(pInputStr+i))==charMap.end()){
- *(pOutputStr+k++)=*(pInputStr+i);
- charMap.insert(pair<char,int>(*(pInputStr+i),1));
- }
- }
- *(pOutputStr+k++)='\n';
- }
- void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){
- int k=0;
- for(int i=0;i<lInputLen;i++){
- int num=1;
- int j=i+1;
- for(;j<lInputLen;j++){
- if(pInputStr[j]==pInputStr[i]){
- num++;
- }else{
- break;
- }
- }
- if(num!=1){
- char str[100];
- sprintf(str,"%d",num);
- strcpy(pOutputStr+k,str);
- k = k+strlen(str);
- }
- *(pOutputStr+k++)=*(pInputStr+i);
- i = j-1;
- }
- *(pOutputStr+k++)='\n';
- }
- bool isOperater(char* c){
- char f[]="+-*/";
- if(c==NULL||strlen(c)!=1){
- return false;
- }
- for(int i=0;i<strlen(f);i++){
- if(f[i]==*c)
- return true;
- }
- return false;
- }
- bool isNumber(char* c,int& num){
- if(c==NULL||strlen(c)<=0){
- return false;
- }
- for(int i=0;i<strlen(c);i++){
- if(c[i]>'9'||c[i]<'0')
- return false;
- }
- num = atoi(c);
- return true;
- }
- struct data{
- public:
- bool isNum;
- union{
- char operater;
- int number;
- }u;
- };
- void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr){
- stack<data> Stack;
- const char *d = " ";
- char s[256];
- strcpy(s,pInputStr);
- char *p;
- int num;
- p = strtok(s,d);
- while(p){
- if(isOperater(p)){ //是操作符
- if(Stack.size()<1){
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }else{
- data data1= Stack.top();
- if(data1.isNum){ //栈顶元素是数字
- data data2;
- data2.isNum = false;
- data2.u.operater=*p;
- Stack.push(data2);
- }else{//栈顶元素是操作符
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- }
- }else if(isNumber(p,num)){ //是数字
- if(Stack.size()<1){
- data data1;
- data1.isNum = true;
- data1.u.number=num;
- Stack.push(data1);
- }else{
- data data1= Stack.top();
- if(data1.isNum){ //栈顶元素是数字
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }else{//栈顶元素是操作符
- Stack.pop();
- data data2 = Stack.top();
- Stack.pop();
- if(!data2.isNum){
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- int num2 = data2.u.number;
- int num3 = 0;
- switch(data1.u.operater){
- case '+':
- num3=num2+num;
- break;
- case '-':
- num3=num2-num;
- break;
- case '*':
- num3=num2*num;
- break;
- case '/':
- num3=num2/num;
- break;
- default:
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- data data3;
- data3.isNum=true;
- data3.u.number=num3;
- Stack.push(data3);
- }
- }
- }else{
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- p=strtok(NULL,d);
- }
- if(Stack.size()==1){
- data d = Stack.top();
- if(d.isNum){
- sprintf(pOutputStr,"%d",d.u.number);
- return;
- }
- }
- strcpy(pOutputStr,"0"); //格式错误
- return;
- }
- int main() {
- char r[256];
- int a = atoi("a");
- char* p="abcddcae";
- stringFilter(p,strlen(p),r);
- cout<<"原字符串:"<<p<<endl;
- cout<<"转换后的字符串:"<<r<<endl;
- p = "aaabbbcceffggh";
- stringZip(p,strlen(p),r);
- cout<<"原字符串:"<<p<<endl;
- cout<<"转换后的字符串:"<<r<<endl;
- p = "1 + 2";
- arithmetic(p,strlen(p),r);
- cout<<"原字符串:"<<p<<endl;
- cout<<"转换后的字符串:"<<r<<endl;
- p = "1a + 2";
- arithmetic(p,strlen(p),r);
- cout<<"原字符串:"<<p<<endl;
- cout<<"转换后的字符串:"<<r<<endl;
- p = "1 + 2 * 3";
- arithmetic(p,strlen(p),r);
- cout<<"原字符串:"<<p<<endl;
- cout<<"转换后的字符串:"<<r<<endl;
- return 0;
- }
2014年华为上机题一
此题是2013年9月14日本人参加上机考试的题目
1、第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50
以下答案是本人写的,已经在vs2008上测试通过,如果有更简便的方法还请提出来。
()先贴一个错误的做法:
#include<iostream>
using namespace std;
int main()
{
int n;
cout<<"请输入数组的长度:"<<endl;
cin>>n;
int *p=new int[n];
for(int i=0;i<n;i++){
cin>>p[i];
//cin>>
}
int max_num=p[0],min_num=p[0];
cout<<"数组的输出: "<<endl;
for(int i=0;i<n;i++){
//cout<<p[i]<<endl;
if(max_num<=p[i]){
max_num=p[i];
}
if(min_num>=p[i]){
min_num=p[i];
}
if(i==n-1){
cout<<max_num+min_num<<endl;
}
}
delete[]p;
return 0;
}
(2)比较正确的做法
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
int temp=0; //将字符转换成数字
int num[50]={0};
int i=0;
char *p;
cin>>s; //输入字符串
//p=s;
cout<<s<<endl;
for(string::size_type ix=0;ix!=s.size();++ix){
if(s[ix]!=','){
temp=temp*10+s[ix]-'0';
}
else{
num[i]=temp;
temp=0;
cout<<num[i]<<endl;
i++;
}
}
//最后一个没有逗号的数字
num[i]=temp;
cout<<num[i]<<endl;
//计算数组中的最大,最小数之和
int min_num=num[0];
int max_num=num[0];
for(int j=0;j<=i;j++){
if(num[j]>=max_num)
max_num=num[j];
if(num[j]<=min_num)
min_num=num[j];
}
cout<<min_num+max_num;
return 0;
}
需要指出的是,输入的控制,这里面第一眼大家都会想到用数组,但是数组的长度是不知道的,无法控制输入,所以很容易陷进去,而用字符串则直接回车后便退出控制台。
2 求两个长长整型的数据的和并输出,例如输入1233333333333333 。。。 3111111111111111111111111.。。。,则输出。。。。
此题同样是采用字符串类似的方法,本文此处用的是char 型指针,用纯C做的,代码不够简洁,还请大家多批评指正。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void main()
{
char *p; //输入数字字符串1
char *q; //输入数字字符串2
char *sum; //求和的字符串
int p_len; //数字字符串1的长度
int q_len; //数字字符串2的长度
//int len;
int len;
int len_temp; //两个字串的最大长度
int xunhuan; //相加循环的次数
int index=0; //求和之后的进位
int d; //求和
int bit;
int i;
int p_bit; //p的每位
int q_bit; //q的每位
//char *temp;
p=(char*)malloc(sizeof(char));
q=(char*)malloc(sizeof(char));
sum=(char*)malloc(sizeof(char));
sum[0]='0'; //初始化进位
scanf("%s",p);
scanf("%s",q);
p_len=strlen(p);
q_len=strlen(q);
if(p_len==q_len){
len=p_len;
for(i=len;i>0;i--){
p_bit=p[i-1]-'0';
q_bit=q[i-1]-'0';
d=(q_bit+p_bit+index)%10;
index=(q_bit+p_bit+index)/10;
sum[i]=d+'0';
}
if(index!=0){
sum[0]=index+'0';
}
sum[len+1]='\0';
if(sum[0]=='0')
printf("%s",sum+1);
else
printf("%s",sum);
}
if(p_len!=q_len)
{
len_temp=(p_len>q_len)?p_len:q_len;
xunhuan=(p_len>q_len)?q_len:p_len;
if(len_temp==p_len){
strcpy(sum+1,p);
}
else{
strcpy(sum+1,q);
}
len=len_temp+1;
for(i=xunhuan;i>=1;i--){
if(p_len>q_len){
p_bit=p[len_temp-1]-'0';
q_bit=q[i-1]-'0';
}
else{
p_bit=p[i-1]-'0';
q_bit=q[len_temp-1]-'0';
}
d=(q_bit+p_bit+index)%10;
index=(q_bit+p_bit+index)/10;
sum[len_temp--]=d+'0';
}
while(index==1){
bit=sum[len_temp]-'0';
d=(bit+index)%10;
index=(bit+index)/10;
// sum[len_temp]=(((sum[len_temp]-'0')+index)/10)+'0';
// index=(index+(sum[len_temp]-'0'))%10;
sum[len_temp]=d+'0';
len_temp--;
}
sum[len]='\0';
if(sum[0]=='0')
printf("%s",sum+1);
else
printf("%s",sum);
}
}
2014华为校园招聘 机试 第三题
根据网传的2014华为校园招聘的机试题目,而编写的代码。
/*
输入一个二叉树 格式为“单个字符+节点所在层次”
比如根节点所在层次是1,它的两个子树都是2. 节点排列从左到右,然后再输入其中的某个(些)节点,
求得其深度。
第三题还有条件:层次不超过9层
输入:a1b2c2d3e3f3 ab
输出:3 2
[输入、输出有点随意]
*/
#include <iostream>
#include <queue>
#include <string>
#include <vector>
using namespace std;
static int maxLevel = 1;
struct Node
{
char ch;
int level;
Node* pLeft;
Node* pRight;
Node(char c, int level)
{
ch = c;
this->level = level;
pLeft = NULL;
pRight = NULL;
}
};
//每次添加新节点时, 将当前的树 按层次遍历添加到队列中
void InitialQueue(queue<Node*>& que, Node* pFirst)
{
que.push(pFirst);
queue<Node*> tempQue;
tempQue.push(pFirst); //申请一个临时用于 操作的队列
while(pFirst)
{
if (pFirst->pLeft !=NULL)
{
que.push(pFirst->pLeft);
tempQue.push(pFirst->pLeft);
}
if (pFirst->pRight != NULL)
{
que.push(pFirst->pRight);
tempQue.push(pFirst->pRight);
}
tempQue.pop();
if (tempQue.empty())
{
break;
}
pFirst = tempQue.front();
}
return;
};
Node* CreateTree(char* source)
{
Node *pRoot = new Node(source[0], source[1]-48);
char* pCopy = source+2;
while (*pCopy != '\0')
{
queue<Node*> que;
InitialQueue(que, pRoot); //层次遍历整个二叉树
char ch = *pCopy;
int level = *(++pCopy)-48;
Node* pNewNode = new Node(ch, level);
while (!que.empty()) //队列不为空
{
Node* queNode = que.front();
if(queNode->level == pNewNode->level -1) //此节点为 待插入节点的上层节点
{
if (queNode->pLeft ==NULL)
{
queNode->pLeft = pNewNode;
que.push(pNewNode);
break;
}else if (queNode->pRight == NULL)
{
queNode->pRight = pNewNode;
que.push(pNewNode);
break;
}else //此上层节点左右孩子已满,弹出
{
que.pop();
}
}else //若不为上层节点,弹出
{
que.pop();
}
}
pCopy++;
}
return pRoot;
}
//获得输入节点在树中的位置
Node* GetPointer(Node* pRoot, char test)
{
queue<Node*> que;
que.push(pRoot);
while (pRoot)
{
if (pRoot->ch == test)
{
return pRoot;
}
if(pRoot->pLeft)
{
if (pRoot->ch == test)
{
return pRoot->pLeft;
}else
{
que.push(pRoot->pLeft);
}
}
if (pRoot->pRight)
{
if (pRoot->pRight->ch == test)
{
return pRoot->pRight;
}else
{
que.push(pRoot->pRight);
}
}
que.pop(); //注意对 队列为空的判断!
if (que.empty())
{
break;
}
pRoot = que.front();
}
return NULL;
}
//找到以输入节点为根节点的树的最大层数
int Ergodic(Node* pNode)
{
if (pNode == NULL)
{
return -1;
}
if (pNode->pLeft != NULL)
{
Ergodic(pNode->pLeft);
maxLevel = max(maxLevel, pNode->pLeft->level);
}
if (pNode->pRight != NULL)
{
Ergodic(pNode->pRight);
maxLevel = max(maxLevel, pNode->pRight->level);
}
return max(maxLevel, pNode->level);
}
vector<int> GetLevel(char* input, char* test)
{
//@1 构建树
vector<int> vec;
Node *pRoot = CreateTree(input);
//@2 找到输入节点在树中的位置
while (*test !='\0')
{
char ch = *test;
Node* pPointer = GetPointer(pRoot, ch);
int tempLevel = pPointer->level; //输入节点(根)所在的层数
maxLevel = tempLevel;
int maxLevel = Ergodic(pPointer); //找到以输入节点为根节点树的,叶子节点所在的最大层数
int level = maxLevel - tempLevel +1;
vec.push_back(level);
test++;
}
return vec;
}
int main()
{
char* input = "a1b2c2d3e4f3g4o4y5h5j6l7";
char* test = "abdeyjfcgohl";
vector<int> vec = GetLevel(input, test);
cout<<input<<endl<<test<<endl;
for (unsigned int i = 0; i<vec.size(); i++)
{
cout<<vec[i]<<" ";
}
return 1;
}
=================================================================================
题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
*/
/*
题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
题目描述(50分):
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
实现:其中第三题写的有些别扭,主要是额外的存储空间,三个函数测试通过了
#include <stdlib.h>
#include <string.h>
//过滤函数
void stringFilter(const char *pInputStr, char *pOutputStr)
{
int a[26] = {0};
const char* pstr = pInputStr;
char* pResult = pOutputStr;
while( *pstr != '\0')
{
a[*pstr - 'a']++;
if(a[*pstr - 'a'] > 1)
{
pstr++;
}
else
{
*pResult = *pstr;
pstr++;
pResult++;
}
}
*pResult = '\0';
}
//压缩字符串
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
const char* pFirst = pInputStr;
const char* pSecond = pInputStr+1;
char* pResult = pOutputStr;
int count = 0;
while(*pSecond != '\0')
{
if(*pSecond == *pFirst)
{
count++;
}
else
{
if(count > 0)
{
*pResult++ = count+1 + '0';
}
*pResult++ = *pFirst;
count = 0;
}
pFirst++;
pSecond++;
}
if(count > 0)
{
*pResult++ = count+1 + '0';
}
*pResult++ = *pFirst;
*pResult = '\0';
}
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char* pTemp = (char*)malloc(lInputLen);
char* pLeft = pTemp;
const char* pRight = pInputStr;
while(*pInputStr != '\0')
{
if(*pInputStr == '+' || *pInputStr == '-')
{
pRight = pInputStr + 1;
break;
}
else
{
*pTemp++ = *pInputStr++;
}
}
*pTemp = '\0';
if (pRight == pLeft || *pRight == '+' || *pRight == '-')
{
*pOutputStr++='0';
*pOutputStr = '\0';
return;
}
int L = atoi(pLeft);
int R = atoi(pRight);
int result;
switch (*pInputStr)
{
case '+':
result = L + R;
break;
case '-':
result = L - R;
break;
default:
result = 0;
break;
}
itoa(result, pOutputStr, 10);
}
int main()
{
//char a[] = "youyouare";
//char a1[] = "deefd";
//char a2[] = "afafafaf";
//char a3[] = "ppppp";
//char* b = (char*)malloc(100);
//char* b1 = (char*)malloc(100);
//char* b2 = (char*)malloc(100);
//char* b3 = (char*)malloc(100);
//
//stringFilter(a,b);
//stringFilter(a1,b1);
//stringFilter(a2,b2);
//stringFilter(a3,b3);
//char t1[] = "cccddecc";
//char t2[] = "deefd";
//char t3[] = "pppppp";
//char rt1[15], rt2[15], rt3[15];
//stringZip(t1,0,rt1);
//stringZip(t2,0,rt2);
//stringZip(t3,0,rt3);
char s1[] = "4+7";
char s2[] = "4-7";
char s3[] = "9++7";
char st1[15], st2[15], st3[15];
arithmetic(s1, strlen(s1), st1);
arithmetic(s2, strlen(s2), st2);
arithmetic(s3, strlen(s3), st3);
}
===============================================================
题目描述:
通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。
如果输入“abc def gh i d”,结果将是abc,def,gh,i,d,
要求实现函数:
void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr); 【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“abc def gh i d” 输出:“abc,def,gh,i,d,”
long j = 0;
for(long i=0;i<lInputLen;i++) {
if(pInputStr[i]!=’ ’) {
pOutputStr[j]= pInputStr[i]; j++; } else {
If(pOutputStr[j-1] != ’,’) {
pOutputStr[j]=’,’; j++; } } }
C_C++_CY_01. 逆序链表输出。
题目描述:
将输入的一个单向链表,逆序后输出链表中的值。链表定义如下:
typedef struct tagListNode {
int value;
struct tagListNode *next; }ListNode;
要求实现函数:
void converse(ListNode **head);
【输入】head: 链表头节点,空间已经开辟好 【输出】head: 逆序后的链表头节点 【返回】无
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:链表 1->2->3->4->5 的头节点head 输出:链表 5->4->3->2->1 的头节点head
{
ListNode *p = new ListNode; ListNode *q = new ListNode; ListNode *t = new ListNode; p = *head; q = p ->next; t = NULL; while(q != NULL) {
t =q->next; q->next = p; p = q; q = t; }
*head = q; delete p; delete q; delete t; }
=========================================================
014华为应届毕业生上机笔试试题(部分)
1、
输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数。
如 输入 “3,3,4,5,6,7,7”
输出 3
2、输入一组身高在170到190之间(5个身高),比较身高差,选出身高差最小的两个身高;若身高差相同,选平均身高高的那两个身高;从小到大输出;
如 输入 170 181 173 186 190
输出 170 173
3、一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人
===========================================================
华为2014校招机试样题解析
传送门:http://company.dajie.com/huawei/job/shhf/topic/206711/detail
需进行上机考试的岗位:软件开发工程师、操作系统工程师、底层软件开发工程师、云计算开发工程师、DSP工程师
在线考试:机考系统的内核为VS2005及JDK1.7,使用Java答题时,类名必须为“Main”;使用C/C++答题时,使用VS2005支持的数据类型和函数。
题目类型:涉及数组、链表、指针、字符串、循环、枚举、排序等等。
考试时长:2小时
考试题目:3道题(共计320分),初级题(60分),中级题(100),高级题(160分),难度递增。
各难度上机考试样题
初级题:从考试成绩中划出及格线
10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
中级题:亮着电灯的盏数
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。
高级题:地铁换乘
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线A(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15
第一题
不用算法
第二题(代码已改正,请看代码)
有关的算法:
1.Eratosthenes筛法求素数
2.判断一个数是否为素数
3.说白了,就是求一个整数的所有约数个数
第三题:
有关算法:Floyed求任意两点之间的最短路径,关键在于建图,即如何用邻接矩阵建图
(Eratosthenes筛法给两个链接:
http://blog.pfan.cn/bclz/37462.html
http://hi.baidu.com/yyvszh/item/b074622d20dbbf0f42634a56
判断素数的算法:
http://www.cppblog.com/amazon/archive/2009/06/20/88107.aspx
关于如何求一个自然数的所有约数个数,看这里:
http://wenku.baidu.com/view/9776d5d8ce2f0066f5332270.html
一个不会TLE的代码看这里:
http://hi.baidu.com/neuxxm01/item/d7c914b88bad9543ba0e12db)
先把几题的思路写在这里,明天再上具体的代码。To be continued
华为机试一般会给出统一的函数接口,不需要自己写main()函数。这里未给出。
格式请看这里(华为2013机试题):http://blog.csdn.net/arcsinsin/article/details/11017169
PS:今年华为的机试没有给出统一的函数接口,而是自己写好程序,然后submit,和OJ判题是一样的。不过测试数据给得没OJ那么严。
题目共三题,一二两题都很简单,只有第三题稍难(但是也很基础,就是著名的取石子游戏),如果你不知道斐波那契博弈的话。
第三题分析及代码请看这里(9月12号新鲜出炉):http://blog.csdn.net/arcsinsin/article/details/11618517
上代码
第一题:
暴力。分别求出0,10,20,......100作为及格线的通过率,取通过率高于60%且最接近60%的及格线为最终的及格线。
PS:此题数据量小,所以可以暴力。若数据量大,则必须自己写排序。但是在机试时时间宝贵,暴力写起来快,可以为后面的题腾出时间。说实话,这道题就是为小白准备的。
- #include<iostream>
- #include<cstdio>
- using namespace std;
- int main()
- {
- int a[10];
- int line[11];
- double p[11];
- int res;
- bool flags = true;
- for (int i = 0; i < 10; i++)
- {
- scanf("%d",&a[i]);
- if (a[i] < 60) flags = false;
- }
- for (int i = 0; i <= 10; i++)
- {
- line[i] = 10*i;
- }
- for (int i = 0; i <= 10; i++)
- {
- int count = 0;
- for (int j = 0; j < 10; j++)
- {
- if (a[j]-line[i] >= 0) count++;
- }
- p[i] = count*1.0/10;
- }
- double min = 1;
- double temp;
- int k;
- for (int i = 0; i < 10; i++)
- {
- temp = p[i] - 0.6;
- if (temp >= 0 && temp < min)
- {
- min = temp;
- k = i;
- }
- }
- res = line[k];
- if (flags) res = 60;
- cout<<res<<endl;
- system("pause");
- return 0;
- }
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[10];
int line[11];
double p[11];
int res;
bool flags = true;
for (int i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
if (a[i] < 60) flags = false;
}
for (int i = 0; i <= 10; i++)
{
line[i] = 10*i;
}
for (int i = 0; i <= 10; i++)
{
int count = 0;
for (int j = 0; j < 10; j++)
{
if (a[j]-line[i] >= 0) count++;
}
p[i] = count*1.0/10;
}
double min = 1;
double temp;
int k;
for (int i = 0; i < 10; i++)
{
temp = p[i] - 0.6;
if (temp >= 0 && temp < min)
{
min = temp;
k = i;
}
}
res = line[k];
if (flags) res = 60;
cout<<res<<endl;
system("pause");
return 0;
}
第二题:
比较简单的做法,就是直接模拟。
- //VS2010环境
- #include "stdafx.h"
- #include<iostream>
- using namespace std;
- bool form[1001];
- int n,count;
- int _tmain(int argc, _TCHAR* argv[])
- {
- while(cin>>n)
- {
- memset(form,1,sizeof(form));
- count = 0;
- for(int i=1;i<=n;i++)
- for(int j=i;j<=n;j++)
- if(j%i==0)
- form[j]=!form[j];
- for(int i=1;i<=n;i++)
- if(form[i]==0)
- count++;
- cout<<"有 "<<count<<" 盏灯是亮着的"<<endl;
- }
- system("pause");
- return 0;
- }
//VS2010环境
#include "stdafx.h"
#include<iostream>
using namespace std;
bool form[1001];
int n,count;
int _tmain(int argc, _TCHAR* argv[])
{
while(cin>>n)
{
memset(form,1,sizeof(form));
count = 0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
if(j%i==0)
form[j]=!form[j];
for(int i=1;i<=n;i++)
if(form[i]==0)
count++;
cout<<"有 "<<count<<" 盏灯是亮着的"<<endl;
}
system("pause");
return 0;
}
第三题:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- //Floyed算法求任意两点之间的最短路径,算法复杂度O(n^3)虽然Floyed算法是求最短路径里面算法复杂度最大的算法,但写法简单,用于此处求任意两点之间的最短路合适
- const int inf = 0x3f3f3f3f;//无穷大
- struct Graph
- {
- char vertex[35][4];
- int edges[35][35];
- int visited[35];
- };
- char s1[21][4]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1",
- "A10","A11","A12","A13","T2","A14","A15","A16","A17","A18","A1"};
- char s2[17][4]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9",
- "B10","T2","B11","B12","B13","B14","B15"};
- char v[35][4]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1",
- "A10","A11","A12","A13","T2","A14","A15","A16","A17","A18",
- "B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11",
- "B12","B13","B14","B15"};
- //关键在于如何建图
- void CreateGraph(Graph * &G)
- {
- int i, j, k;
- for (i = 0; i < 35; i++)
- {
- memcpy(G->vertex[i],v[i],sizeof(v[i]));
- G->visited[i] = 0;
- }
- for (i = 0; i < 35; i++)
- {
- for (j = 0; j < 35; j++)
- {
- G->edges[i][j] = inf;
- }
- }
- for (k = 0; k < 20; k++)
- {
- for (i = 0;strcmp(s1[k],G->vertex[i])!=0; i++);
- for (j = 0;strcmp(s1[k+1],G->vertex[j])!=0;j++);
- G->edges[i][j] = 1;
- G->edges[j][i] = 1;
- }
- for (k = 0; k < 16; k++)
- {
- for (i = 0;strcmp(s2[k],G->vertex[i])!=0; i++);
- for (j = 0; strcmp(s2[k+1],G->vertex[j])!=0; j++);
- G->edges[i][j] = 1;
- G->edges[j][i] = 1;
- }
- }
- //Floyed算法求任意两点之间的最短路径
- void Floyed(Graph * &G)
- {
- int i,j,k;
- for (k = 0; k < 35; k++)
- {
- for (i = 0; i < 35; i++)
- {
- for (j = 0; j < 35; j++)
- {
- if (G->edges[i][k] + G->edges[k][j] < G->edges[i][j])
- {
- G->edges[i][j] = G->edges[i][k] + G->edges[k][j];
- }
- }
- }
- }
- }
- void ace(Graph *G)
- {
- char s1[4],s2[4];
- int i,j;
- cout<<"请输入起点站与终点站"<<endl;
- cin>>s1>>s2;
- for (i = 0;strcmp(s1,G->vertex[i])!=0;i++);
- for (j = 0;strcmp(s2,G->vertex[j])!=0;j++);
- cout<<G->edges[i][j]+1<<endl;
- }
- int main()
- {
- Graph *G = new Graph;
- CreateGraph(G);
- Floyed(G);
- while(1)
- {
- ace(G);
- }
- system("pause");
- return 0;
- }
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//Floyed算法求任意两点之间的最短路径,算法复杂度O(n^3)虽然Floyed算法是求最短路径里面算法复杂度最大的算法,但写法简单,用于此处求任意两点之间的最短路合适
const int inf = 0x3f3f3f3f;//无穷大
struct Graph
{
char vertex[35][4];
int edges[35][35];
int visited[35];
};
char s1[21][4]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1",
"A10","A11","A12","A13","T2","A14","A15","A16","A17","A18","A1"};
char s2[17][4]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9",
"B10","T2","B11","B12","B13","B14","B15"};
char v[35][4]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1",
"A10","A11","A12","A13","T2","A14","A15","A16","A17","A18",
"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11",
"B12","B13","B14","B15"};
//关键在于如何建图
void CreateGraph(Graph * &G)
{
int i, j, k;
for (i = 0; i < 35; i++)
{
memcpy(G->vertex[i],v[i],sizeof(v[i]));
G->visited[i] = 0;
}
for (i = 0; i < 35; i++)
{
for (j = 0; j < 35; j++)
{
G->edges[i][j] = inf;
}
}
for (k = 0; k < 20; k++)
{
for (i = 0;strcmp(s1[k],G->vertex[i])!=0; i++);
for (j = 0;strcmp(s1[k+1],G->vertex[j])!=0;j++);
G->edges[i][j] = 1;
G->edges[j][i] = 1;
}
for (k = 0; k < 16; k++)
{
for (i = 0;strcmp(s2[k],G->vertex[i])!=0; i++);
for (j = 0; strcmp(s2[k+1],G->vertex[j])!=0; j++);
G->edges[i][j] = 1;
G->edges[j][i] = 1;
}
}
//Floyed算法求任意两点之间的最短路径
void Floyed(Graph * &G)
{
int i,j,k;
for (k = 0; k < 35; k++)
{
for (i = 0; i < 35; i++)
{
for (j = 0; j < 35; j++)
{
if (G->edges[i][k] + G->edges[k][j] < G->edges[i][j])
{
G->edges[i][j] = G->edges[i][k] + G->edges[k][j];
}
}
}
}
}
void ace(Graph *G)
{
char s1[4],s2[4];
int i,j;
cout<<"请输入起点站与终点站"<<endl;
cin>>s1>>s2;
for (i = 0;strcmp(s1,G->vertex[i])!=0;i++);
for (j = 0;strcmp(s2,G->vertex[j])!=0;j++);
cout<<G->edges[i][j]+1<<endl;
}
int main()
{
Graph *G = new Graph;
CreateGraph(G);
Floyed(G);
while(1)
{
ace(G);
}
system("pause");
return 0;
}
以上定有不足之处,还请多多指教。
=====================================
2014华为校园招聘机试——字符串过滤、压缩等
看了很多博客,发现今年去华为机试的人,同一批的题目大多都是相同的,不同批次的题目大多不相同。当然,这些题目可能在以前出现过,去年,或者前年等。所以,多看一下不同人的题目,对自己是有好处的!
说一下机试的打分情况。机试的打分是通过测试用例的成功数量来给分的,每个用例20分,一共16个用例(共三道题,共320分=60(题一)+100(题二)+160(题三)),通过一个用例,给20分,通过两个,给40分,以此类推。所以答题时一定要注意边界条件,考虑周全。
以下是一位机试者的题目,是用c实现的,我用JAVA重写了一遍,并发现他的程序有几个问题。
题一:
- public class Test4_1 {
- private static void stringFilter(char[] inputStr,long length,char[] outputStr){
- int[] a=new int[26];
- int len=0;
- for(int i=0;i<length;i++){
- int temp=0;
- temp=inputStr[i]-'a';
- if(a[temp]==0){
- outputStr[len++]=inputStr[i];
- a[temp]=1;
- }else{
- continue;
- }
- }
- }
- public static void main(String[] args){
- char[] inputStr=new char[]{'d','e','e','f','d','e','p'};
- long n=inputStr.length;
- char[] outputStr=new char[(int)n];
- stringFilter(inputStr,n,outputStr);
- for(int i=0;i<n;i++){
- System.out.print(outputStr[i]);
- }
- }
public class Test4_1 {
private static void stringFilter(char[] inputStr,long length,char[] outputStr){
int[] a=new int[26];
int len=0;
for(int i=0;i<length;i++){
int temp=0;
temp=inputStr[i]-'a';
if(a[temp]==0){
outputStr[len++]=inputStr[i];
a[temp]=1;
}else{
continue;
}
}
}
public static void main(String[] args){
char[] inputStr=new char[]{'d','e','e','f','d','e','p'};
long n=inputStr.length;
char[] outputStr=new char[(int)n];
stringFilter(inputStr,n,outputStr);
for(int i=0;i<n;i++){
System.out.print(outputStr[i]);
}
}
输出:defp
题二:
- public class Test3 {
- private static void stringZip(char[] inputStr,long length,char[] outputStr){
- int i=0;
- int len=0;
- while(i<length){
- int time=1;
- char c=inputStr[i++];
- while(i<length&&c==inputStr[i]){
- time++;
- i++;
- }
- if(time==1){
- outputStr[len++]=c;
- }else if(time<=9){
- outputStr[len++]=(char)(time+'0');
- outputStr[len++]=c;
- }else if(time<=99){
- outputStr[len++]=(char)(time/10+'0');
- outputStr[len++]=(char)(time%10+'0');
- outputStr[len++]=c;
- }else{
- //当连续重复的字符数超过99时,用一个“?”来表示。
- outputStr[len++]=(char)63;
- outputStr[len++]=c;
- }
- }
- }
- public static void main(String[] args){
- char[] inputStr=new char[]{'c','a','a','f','f','f','f','f','f','f','f','f','f','f','f'};
- long length=inputStr.length;
- char[] outputStr=new char[(int)length];
- stringZip(inputStr,length,outputStr);
- for(int i=0;i<outputStr.length;i++){
- System.out.print(outputStr[i]);
- }
- }
- }
public class Test3 {
private static void stringZip(char[] inputStr,long length,char[] outputStr){
int i=0;
int len=0;
while(i<length){
int time=1;
char c=inputStr[i++];
while(i<length&&c==inputStr[i]){
time++;
i++;
}
if(time==1){
outputStr[len++]=c;
}else if(time<=9){
outputStr[len++]=(char)(time+'0');
outputStr[len++]=c;
}else if(time<=99){
outputStr[len++]=(char)(time/10+'0');
outputStr[len++]=(char)(time%10+'0');
outputStr[len++]=c;
}else{
//当连续重复的字符数超过99时,用一个“?”来表示。
outputStr[len++]=(char)63;
outputStr[len++]=c;
}
}
}
public static void main(String[] args){
char[] inputStr=new char[]{'c','a','a','f','f','f','f','f','f','f','f','f','f','f','f'};
long length=inputStr.length;
char[] outputStr=new char[(int)length];
stringZip(inputStr,length,outputStr);
for(int i=0;i<outputStr.length;i++){
System.out.print(outputStr[i]);
}
}
}
输出:c2a12f
题三:
- public class Test4_2 {
- private static void arithmetic(char[] inputStr,long length,char[] outputStr){
- int num1=0;
- int num2=0;
- boolean first=true;
- boolean oper=false;
- boolean zero=false;
- int once=0;
- for(int i=0;i<length;i++){
- if(inputStr[i]==' '){
- continue;
- }
- if(inputStr[i]>='0'&&inputStr[i]<='9'){
- if(first){
- num1=num1*10+inputStr[i]-'0';
- }else{
- num2=num2*10+inputStr[i]-'0';
- }
- }else{
- if(once==0){
- if(inputStr[i]=='-'){
- oper=false;
- once=1;
- }else{
- oper=true;
- once=1;
- }
- first=false;
- }else{
- zero=true;
- break;
- }
- }
- }
- if(zero){
- outputStr[0]='0';
- }else{
- int sum=0;
- if(oper){
- sum=num1+num2;
- }else{
- sum=num1-num2;
- }
- int i=0;
- if(sum<0){
- outputStr[i++]='-';
- sum=0-sum;
- }
- if(sum>=0&&sum<=9){
- outputStr[i++]=(char)(sum+'0');
- }else if(sum>9&&sum<=99){
- int tmp=sum/10;
- outputStr[i++]=(char)(tmp+'0');
- sum=sum%10;
- outputStr[i++]=(char)(sum+'0');
- }else if(sum>99){
- int tmp=sum/100;
- outputStr[i++]=(char)(tmp+'0');
- sum=sum%100;
- tmp=sum/10;
- outputStr[i++]=(char)(tmp+'0');
- sum=sum%10;
- outputStr[i++]=(char)(sum+'0');
- }
- }
- }
- public static void main(String[] args){
- char[] inputStr=new char[]{'4',' ','-',' ','7'};
- long n=inputStr.length;
- char[] outputStr=new char[(int)n];
- arithmetic(inputStr,n,outputStr);
- for(int i=0;i<outputStr.length;i++){
- System.out.print(outputStr[i]);
- }
- }
- }
public class Test4_2 {
private static void arithmetic(char[] inputStr,long length,char[] outputStr){
int num1=0;
int num2=0;
boolean first=true;
boolean oper=false;
boolean zero=false;
int once=0;
for(int i=0;i<length;i++){
if(inputStr[i]==' '){
continue;
}
if(inputStr[i]>='0'&&inputStr[i]<='9'){
if(first){
num1=num1*10+inputStr[i]-'0';
}else{
num2=num2*10+inputStr[i]-'0';
}
}else{
if(once==0){
if(inputStr[i]=='-'){
oper=false;
once=1;
}else{
oper=true;
once=1;
}
first=false;
}else{
zero=true;
break;
}
}
}
if(zero){
outputStr[0]='0';
}else{
int sum=0;
if(oper){
sum=num1+num2;
}else{
sum=num1-num2;
}
int i=0;
if(sum<0){
outputStr[i++]='-';
sum=0-sum;
}
if(sum>=0&&sum<=9){
outputStr[i++]=(char)(sum+'0');
}else if(sum>9&&sum<=99){
int tmp=sum/10;
outputStr[i++]=(char)(tmp+'0');
sum=sum%10;
outputStr[i++]=(char)(sum+'0');
}else if(sum>99){
int tmp=sum/100;
outputStr[i++]=(char)(tmp+'0');
sum=sum%100;
tmp=sum/10;
outputStr[i++]=(char)(tmp+'0');
sum=sum%10;
outputStr[i++]=(char)(sum+'0');
}
}
}
public static void main(String[] args){
char[] inputStr=new char[]{'4',' ','-',' ','7'};
long n=inputStr.length;
char[] outputStr=new char[(int)n];
arithmetic(inputStr,n,outputStr);
for(int i=0;i<outputStr.length;i++){
System.out.print(outputStr[i]);
}
}
}
输出:-3
===================================================
2013华为校园招聘上机题——约瑟夫环
输入一个由随机数组成的数列(数列中每个数均是大于
0
的整数,长度已知),和初始计数值m。从数列首位置
开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始
计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。
请编程实现上述计数过程,同时输出数值出列的顺序。
这道题不难,但发现很多人给出的答案中的数列不是随机生成的,现在加上随机生成的数列的约瑟夫环的实现过程。
- packagehuawei;
- importjava.util.LinkedList;
- importjava.util.Random;
- publicclassTest6_1 {
- privatestaticintscanPeople(String s) {
- //用链表来实现“约瑟夫环”是一种很好的方式,可以方便的动态插入、删除、移动等。
- LinkedList<Integer> plist=newLinkedList<Integer>();
- try{
- intn=Integer.parseInt(s);
- intstart=1;
- intend=20;
- Random rand=newRandom();
- for(inti=0;i<n;i++){
- //由于题目要求“数列中每个数均是大于0的整数”,而系统提供的Random是从0开始的,
- //故自己写一个任意的范围可控的函数showRandom,如下:
- intj=showRandom(start,end,rand);
- plist.add(j);
- System.out.print(j+" ");
- }
- System.out.println("***");
- intcirclecount=0;
- while(plist.size()>1){
- for(inti=0;i<plist.size();i++){
- circlecount++;
- //这里的m=3,且m是可以随意设置的
- if(circlecount==3){
- plist.remove(i);
- //删除了一个元素,后面的元素会整体前移一个单位,故减一
- i--;
- circlecount=0;
- }
- }
- }
- returnplist.get(0);
- }catch(NumberFormatException e){
- return0;
- }
- }
- privatestaticintshowRandom(intstart,intend,Random rand){
- if(start>end){
- thrownewIllegalArgumentException("start cannot exceed end");
- }
- longrange=(long)(end-start+1);
- longfraction=(long)(range*rand.nextDouble());
- intsum=(int)(start+fraction);
- returnsum;
- }
- publicstaticvoidmain(String[] args){
- System.out.println(scanPeople("12"));
- System.out.println(scanPeople("11a"));
- }
- }
packagehuawei;
importjava.util.LinkedList;
importjava.util.Random;
publicclassTest6_1 {
privatestaticintscanPeople(String s) {
//用链表来实现“约瑟夫环”是一种很好的方式,可以方便的动态插入、删除、移动等。
LinkedList<Integer> plist=newLinkedList<Integer>();
try{
intn=Integer.parseInt(s);
intstart=1;
intend=20;
Random rand=newRandom();
for(inti=0;i<n;i++){
//由于题目要求“数列中每个数均是大于0的整数”,而系统提供的Random是从0开始的,
//故自己写一个任意的范围可控的函数showRandom,如下:
intj=showRandom(start,end,rand);
plist.add(j);
System.out.print(j+" ");
}
System.out.println("***");
intcirclecount=0;
while(plist.size()>1){
for(inti=0;i<plist.size();i++){
circlecount++;
//这里的m=3,且m是可以随意设置的
if(circlecount==3){
plist.remove(i);
//删除了一个元素,后面的元素会整体前移一个单位,故减一
i--;
circlecount=0;
}
}
}
returnplist.get(0);
}catch(NumberFormatException e){
return0;
}
}
privatestaticintshowRandom(intstart,intend,Random rand){
if(start>end){
thrownewIllegalArgumentException("start cannot exceed end");
}
longrange=(long)(end-start+1);
longfraction=(long)(range*rand.nextDouble());
intsum=(int)(start+fraction);
returnsum;
}
publicstaticvoidmain(String[] args){
System.out.println(scanPeople("12"));
System.out.println(scanPeople("11a"));
}
}
http:
//www.javapractices.com/topic/TopicAction.do?Id=62
=========================
华为机试有一道“鉴定回文数”的题,看了一些文章,不管是用数组实现,还是用字符串实现,代码都太多,太麻烦。
本人用java的字符串,只需几行代码,轻松搞定。
- public class IsSymmetry {
- //对比其他方法,你会发现函数symmetry的代码行数很少。
- private static String symmetry(long data){
- String s=data+"";
- for(int i=0;i<s.length()/2;i++){
- if(s.charAt(i)!=s.charAt(s.length()-1-i)){
- return "No";
- }
- }
- return "Yes";
- }
- public static void main(String[] args){
- long n1=1436341;
- long n2=1234565;
- System.out.println(n1+"是回文数吗?"+symmetry(n1));
- System.out.println(n2+"是回文数吗?"+symmetry(n2));
- }
- }
public class IsSymmetry {
//对比其他方法,你会发现函数symmetry的代码行数很少。
private static String symmetry(long data){
String s=data+"";
for(int i=0;i<s.length()/2;i++){
if(s.charAt(i)!=s.charAt(s.length()-1-i)){
return "No";
}
}
return "Yes";
}
public static void main(String[] args){
long n1=1436341;
long n2=1234565;
System.out.println(n1+"是回文数吗?"+symmetry(n1));
System.out.println(n2+"是回文数吗?"+symmetry(n2));
}
}
输出:1436341是回文数吗?Yes
1234565是回文数吗?No
=====
今天华为面试失败,来这里吐槽,发发牢骚,缓解一下情绪。感悟几点如下:
1.面试时间很长。昨晚收到面试通知,今早就提前赶到华为,9:40签到,10点的时候叫到我,被面试官带到一个很多的大厅里面,那里有很多人在面试,一对一,而不是群面(当时感觉蛮不错的,这至少说明华为尊重每一位应聘者)。这第一面是技术面,从我之前面试回来的同学那里知道他们大多在40分钟左右,最快20分钟搞定的都有,而我的面试从10点整开始,一直到11点整才结束,足足一个小时。当时觉得面这么久,进去的可能性很大,可快结束的时候,他跟我说了一句,“我这面就不过了”。一听到这句话,顿时头脑一片空白,持续了好久秒钟。所以,面得久也不一定就好。
2.技术问题。第一个问题,他问了折半插入排序的时间复杂度,我答出来了,O(nlogn)。他让我用旁边的笔和纸演示一下是如何插入的,我详细的演示了一遍。他问这个复杂度是怎么算的,我也分析了n和logn。他最后让我详细的演示一下去掉O的时间复杂度的过程,我说忘了。他就没在继续往下问,这里虽然有点问题,但自我感觉还可以。第二个问题,他问了hashTable和hashMap的区别,我说有7个区别,准备一一列出,刚说完第二个,他就说那是书上的,用你自己的话说。我马上说了同步这一点。他暗示这点是对的,但不全,接着听他补充了一些。
3.兴趣问题。由于跟导师做过天线,而现在面试的岗位是“软件研发”,他就说,“智能天线的前途非常好,问我为何从事软件行业“,我说了一大堆自己开始对软件感兴趣,并想往这边深入进去的事。他就说我太乐观,并强调”码农的工作很枯燥的,和其他行业的工人没什么区别“。在交谈了一段时间之后,他说,”如果你做这个3年之后,感到没兴趣了,你就会离开,华为新员工工作3年左右的离职率在50%左右“,停顿了一会儿,他接着说道,”兴趣什么都不是“。听到这句话时,心有点凉了。感觉这位在华为工作了13年(他自己说的)的员工在感慨程序员生活枯燥、不乐观的同时,也失去了对美好程序人生的憧憬和向往。让我顿时想起了一句话,”经验会阻碍你前进的步伐“。
4.java VS c++。由于我面的是java,他就说java的是偏应用层的,很多库类已经被封装起来,直接调用就是,这里没有太多作为,没有太大吸引力。所以短时间内上手之后,就是不断的重复性的工作。问我到时没兴趣了之后怎么办,我说可以往底层发展,做后端开发。他说:”从后端到前端易,从前端到后端难啊“。”相信我,兴趣能让我克服这些困难的“,我接着说道。他笑了笑,从他的相声中,我听到了”鄙视“。聊了一下之后,他说我没有C++方面的经验,想做底层开发,应该学c++,同时看一些算法和数据结构的书。
5.面试官。说实话,他还是蛮和善的,整个过程都比较轻松,没有给我压力和其他不良的信号。他给我一些建议也是比较中肯的,谢谢!