华为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;
}