华为2019实习生招聘软件编程题

华为2019实习生招聘软件编程题

题目这里就不再重复,当时只ac了两题,第三题是实现一个高精度乘法,由于调试的时候,一直有个bug没搞出来,后来才发现是模拟手算的一个双重循环中

	for(int i=0;i<len1;i++){
		k=i;
		for(int j=0;j<len2;j++){
			c[k]+=a[i]*b[j];
			k++;
		}
	}

写成了

	for(int i=0;i<len1;i++){
		k=i;
		for(int j=0;j<len2;j++){
			c[k]+=a[i]*b[i];  //万恶的粗心
			k++;
		}
	}

不过也没什么好说的,自己太久没有打码,连一个高精度都搞了半天。

另外第二题,也花了挺长时间,还用了自己认为很傻逼的方法(将表示16进制的字符串转为2进制的字符串那里,我直接枚举了),hhhh,求各位大神别笑这种傻操作。

第一题:

找出字符串中连续的数字串,并将最长的数字串和对用的长度输出,其中若出现长度相同的,选择最末尾出现的字符串。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	string s;
	cin>>s;
	string max;
	for(int i=0;i<s.length();i++){
		string temp;
		while(s[i]>='0'&&s[i]<='9'){
			temp+=s[i];
			i++;
		}
		if(temp.length()>=max.length()){
			max=temp;
		}
	}
	cout<<max<<","<<max.length()<<endl;
}

第二题:转码,题目不想重复了,其实也就是字符串操作,16进制转2进制,2进制转10进制这类,下面代码有傻操作,请忽略。

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int k=0;
typedef struct 
{

     unsigned int uiElementLength;    //表示uiElementValue占用BIT数,范围1~32

     unsigned int uiElementValue;     //从字节流中按顺序解析的数值,用于输出

}ELEMENT_STRU;
void Decode(unsigned int uiInputLen, unsigned char aInputByte[], unsigned int uiElementNum, ELEMENT_STRU astElement[]){
	int t=0;
	for(int i=0;i<uiElementNum;i++){
		unsigned int temp=0;
		unsigned int r=1;
		for(int j=astElement[i].uiElementLength-1;j>=0;j--){
			if(j+t>k-1) break;
			if(aInputByte[j+t]=='1'){
				temp+=r;
			}
			else{
				
			}
			r*=2;
		}
		cout<<temp<<endl;
		t+=astElement[i].uiElementLength;
	}
}
int main(){
	unsigned int uiInputLen;
	cin>>uiInputLen;
	string input[10000];
	unsigned char aInputByte[100000];
//	int k=0;
	for(int i=0;i<uiInputLen;i++){
		cin>>input[i];
		for(int j=2;j<input[i].length();j++){
			if(input[i][j]=='0'){
				aInputByte[k]='0';aInputByte[k+1]='0';aInputByte[k+2]='0';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='1'){
				aInputByte[k]='0';aInputByte[k+1]='0';aInputByte[k+2]='0';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='2'){
				aInputByte[k]='0';aInputByte[k+1]='0';aInputByte[k+2]='1';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='3'){
				aInputByte[k]='0';aInputByte[k+1]='0';aInputByte[k+2]='1';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='4'){
				aInputByte[k]='0';aInputByte[k+1]='1';aInputByte[k+2]='0';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='5'){
				aInputByte[k]='0';aInputByte[k+1]='1';aInputByte[k+2]='0';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='6'){
				aInputByte[k]='0';aInputByte[k+1]='1';aInputByte[k+2]='1';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='7'){
				aInputByte[k]='0';aInputByte[k+1]='1';aInputByte[k+2]='1';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='8'){
				aInputByte[k]='1';aInputByte[k+1]='0';aInputByte[k+2]='0';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='9'){
				aInputByte[k]='1';aInputByte[k+1]='0';aInputByte[k+2]='0';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='A'){
				aInputByte[k]='1';aInputByte[k+1]='0';aInputByte[k+2]='1';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='B'){
				aInputByte[k]='1';aInputByte[k+1]='0';aInputByte[k+2]='1';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='C'){
				aInputByte[k]='1';aInputByte[k+1]='1';aInputByte[k+2]='0';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='D'){
				aInputByte[k]='1';aInputByte[k+1]='1';aInputByte[k+2]='0';aInputByte[k+3]='1';
				k+=4;
			}
			else if(input[i][j]=='E'){
				aInputByte[k]='1';aInputByte[k+1]='1';aInputByte[k+2]='1';aInputByte[k+3]='0';
				k+=4;
			}
			else if(input[i][j]=='F'){
				aInputByte[k]='1';aInputByte[k+1]='1';aInputByte[k+2]='1';aInputByte[k+3]='1';
				k+=4;
			}
			else{
				
			}
		}
//		for(int j=0;j<k;j++){
//			cout<<aInputByte[j];
//		}
//		cout<<endl;
	}
	ELEMENT_STRU astElement[100000];
	unsigned int uiElementNum;
	cin>>uiElementNum;
	for(int i=0;i<uiElementNum;i++){
		cin>>astElement[i].uiElementLength;
	}
	
	Decode(uiInputLen, aInputByte, uiElementNum, astElement);
	
	
}

第三题:高精度乘法(带符号)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
	string s1, s2;
	cin>>s1>>s2;
//	int k=0;
	int flag1=0,flag2=0;
	int a[1000],b[1000],c[1000];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	int len1=0,len2=0;
	reverse(s1.begin(),s1.end());
	reverse(s2.begin(),s2.end());
	//cout<<s1<<endl<<s2<<endl; 
	for(int i=0;i<s1.length();i++){
		if(s1[i]=='-') flag1=1;
		else{
			a[len1++]=int(s1[i]-'0');
		}
	}
	for(int i=0;i<s2.length();i++){
		if(s2[i]=='-') flag2=1;
		else{
			b[len2++]=int(s2[i]-'0');
		}
	}
	
//	for(int i=0;i<len2;i++){
//		cout<<b[i];
//	}
//	cout<<endl;
	
	int k; //记录位数最后到哪里 
	//cout<<len1<<" "<<len2<<endl;
	for(int i=0;i<len1;i++){
		k=i;
		for(int j=0;j<len2;j++){
			c[k]+=a[i]*b[j];
			k++;
		}
	}
	//cout<<k<<endl;
	for(int i=0;i<k;i++){
		//cout<<c[i]<<endl;
		c[i+1]+=c[i]/10;
		c[i]=c[i]%10;
	}
	
	int index=999; //找到不为0的位数 
	while(c[index]==0){
		index--;
	}
	//cout<<index<<endl;
	
	char res[1000];
	
	int q=0;
	if((flag1==1&&flag2==0)||(flag1==0&&flag2==1)){
		res[q]='-';
		q++;
	}
	for(int i=index;i>=0;i--){
		res[q++]=char(c[i]+'0');
	}
	res[q]='\0';
	
	for(int i=0;i<=q;i++){
		cout<<res[i];
	}
	cout<<endl;
}


猜你喜欢

转载自blog.csdn.net/Awille/article/details/79653875