您的位置:首页 > 其它

[置顶] 2018华为校招机试题目

2017-11-22 10:57 405 查看
华为机试一共3道题,第1题100分,第2题200分,第3题300分,满分600分。考试时间为两个小时。想拿sp,当然要全部AC了。

1.数字处理

题目描述:给出一个不多于5位的整数,进行反序处理,要求

(1)求出它是几位数

(2)分别输出每一个数字(空格隔开)

(3)按逆序输出各位数字(仅数字间以空格间隔,负号与数字之间不需要间隔)

输入描述:位数不大于5的整数

输出描述:1.整数位数 2.空格间隔输出结果 3.逆序整数
#include <vector>
#include <string>
#include <iostream>
using namespace std;

int main()
{
int iInput;
int iNum=0;
char* strRst="";
int iOutput=0;

cin >> iInput;

int k = 0;
int temp;
int flag;
int iTemp;
if (iInput < -99999 || iInput > 99999)
return -1;
if (iInput < 0)
{
flag = -1;
iInput = -iInput;
}
else
flag = 1;
temp = iInput;
vector<int> resStr;
while (temp)
{
++iNum;
iTemp = temp % 10;
resStr.push_back(iTemp);
iOutput = iOutput * 10 + iTemp;
temp /= 10;
}
cout << iNum << endl;

if (flag == -1)
cout << "-";
for (int i = iNum - 1; i >= 0; --i)
{
if (i == iNum - 1)
cout << resStr[i];
else
{
cout << " " << resStr[i];
}
}
cout << endl;
iOutput = flag*iOutput;

cout << iOutput << endl;

system("pause");
return 0;
}

2.IP地址交集判断

题目描述:输入四个IP端,前两个为第一个IP段的起始和终止地址,后两个是第二个IP段的起始和终止地址,判断这两个IP段是否存在交集

输入描述:输入4个IP

输出描述:如果存在交集,输出 Overlap IP ; 如果不存在交集,输出 No Overlap IP 
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cassert>
using namespace std;

int *dec2bin(int decnum)
{
int i, a, *b = { 0 };
a = decnum;
for (i = 7; i >= 0; i--)
{
b[i] = a % 2;
a = a / 2;
}
return b;
}

int ipToInt(char *ipString)
{
assert(ipString != NULL);
int i = 0, j, n, count = 0, return_num = 0;
char *tmp;
int *tmp_num=NULL, *num=NULL, *d2b;
char *s = ipString, *s_tmp=NULL;

if (*s == '.')
count++;
count++;
if (count != 4)
return 0;

while (*s != '\0')
{
if (*s != '.')
{
n = s - s_tmp;
tmp = (char*)malloc(n*sizeof(char));
memcpy(tmp, s, n);
tmp_num[i] = atoi(tmp);
d2b = dec2bin(tmp_num[i]);
for (j = 0; j<8; j++)
num[8 * i + j] = d2b[j];
s++;
i++;
s_tmp = s;
}
s++;
}
if (*s = '\0')
{
n = s - s_tmp;
tmp = (char*)malloc(n*sizeof(char));
memcpy(tmp, s, n);
tmp_num[i] = atoi(tmp);
d2b = dec2bin(tmp_num[i]);
for (j = 0; j<8; j++)
num[8 * i + j] = d2b[j];
}
for (j = 0; j<32; j++)
return_num = return_num * 2 + num[j];

return return_num;
}

int main(void)
{
char *s1, *s2, *s3, *s4;
s1 = new char;
s2 = new char;
s3 = new char;
s4 = new char;
cin >> s1 >> s2 >> s3 >> s4;
int n1, n2, n3, n4, i;
n1 = ipToInt(s1);
n2 = ipToInt(s2);
n3 = ipToInt(s3);
n4 = ipToInt(s4);
if (n4<n1 || n3>n2)
cout << "No Overlap IP" << endl;
else
cout << "Overlap IP" << endl;

system("pause");
return 0;
}

3.数字排序

题目描述: 给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数,排序要求:按照每一个正整数的后三位数字组成的整数进行从小到大排序(1)如果不足三位,则按照实际位数组成的整数进行比较(2)如果相等,则按照输入字符中的原始顺序排序

说明:(1)字符串以‘\0’结尾,仅包含数字、空格(2)字符串内正整数之间以单个空格分隔,字符串首尾没有空格(3)正整数格式为十进制,大小1~1000000,正整数的数字非零开始

输入描述:第一行为一个整数字符串,里面包含若干个整数,以空格分割,第二行为一个整数,即指定的位置

输出描述:输出指定位置的整数

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;

int find_string(const char* input_string, int serial_number, int output_string_max_length, char* output_string)
{
int size = strlen(input_string);
vector<int> vec;
int tmp = 0;
for (size_t i = 0; i <= size; ++i){
if (input_string[i] == ' ' || i == size){
if (tmp == 0){
return -1;
}
vec.push_back(tmp);
tmp = 0;
}
else{
tmp = tmp * 10 + input_string[i] - '0';
}
}

int n = vec.size();
for (int i = 0; i < n - 1; ++i){
for (int j = 0; j < n - i - 1; ++j){
if (vec[j] % 1000 > vec[j + 1] % 1000){
swap(vec[j], vec[j + 1]);
}
}
}
if (serial_number > vec.size()){
return -1;
}
char num[11];
sprintf(num, "%d", vec[serial_number - 1]);
int len = strlen(num);
cout << num;
return 0;
}

int main()
{
string s1;
getline(cin, s1);
int t;

char *input_string = const_cast<char *>(s1.data());

int serial_number, output_string_max_length=0;
char* output_string = NULL;
cin >> serial_number;

t=find_string(input_string, serial_number, output_string_max_length, output_string);

system("pause");
return 0;
}


因为只要AC就可以了,所以代码写得不够简洁,求轻喷。如有更好的做法,欢迎交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: