收集的华为的上机题

2014届校园招聘上机题:

题目一:

手机电池余量
描述: 自从有了智能手机,时刻都要关心手机的电量。你的任务很简单,用程序打印符号来表示当前手机的电量。

 

用10行和10列来表示电池的电量,同时在外围加上边框,每一行表示10%的电量。

假设还有60%的电量,则显示如下:

+----------+
|----------|
|----------|
|----------|
|----------|
|++++++++++|
|++++++++++|
|++++++++++|
|++++++++++|
|++++++++++|
|++++++++++|
+----------+
 
运行时间限制: 无限制
内存限制: 无限制
输入: 多组测试数据,第一行为测试数据组数N(N<10),紧接着是N行,每行一个数,表示电量,这个数值可能是0,10,20,30,40,50,60,70,80,90,100
 
输出: 每组数据输出一个电池的电量,每组数据之间用15个“=”隔开
 
样例输入: 2
50
0

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 void print(int N,int num[])
 7 {
 8 if (N == 0 || num == NULL)
 9 {
10 return;    
11 }
12 string str1 = "+----------+";
13 string str2 = "|----------|";
14 string str3 = "|++++++++++|";
15 string str4 = "===============";
16 
17 int temp;
18 int i,j;
19 char totalnum = 10;
20 for (i=0;i<N;i++)
21 {
22 cout<<str1<<endl;
23 
24 temp = num[i] / 10;
25 for (j=0;j<totalnum-temp;++j)
26 {
27 cout<<str2<<endl;
28 }
29 for (j=0;j<temp;++j)
30 {
31 cout<<str3<<endl;
32 }    
33 cout<<str1<<endl;
34 cout<<str4<<endl;
35 }
36 }
37 
38 
39 int main()
40 {
41 int N;
42 int i;
43 cin>>N;
44 int *num = new int[N];
45 for (i=0;i<N;++i)
46 {
47 cin>>num[i];
48 }
49 
50 print(N,num);
51 
52 return 0;
53 }

第二题:

最具夫妻相
描述: 在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具“夫妻相”的人。题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。
规则1:如果字母重复数最多的女士有多位相同,则以最先匹配的女士做为最具“夫妻相”的人选。
规则2:人名中的相同字母,按重复一次处理。例如:li ling 与li lei 重复的字符个数为2,而不是4。
预置女士名单(先后循序必须保证):
"wang fei",
"zhang man yu",
"zhang zhi yi",
"li li",
"li xiao man",
"li yu cun",
"yang ni",
"xiao tong",
"li lei",
"zhang san"
 
 
运行时间限制: 无限制
内存限制: 无限制
输入: 输入一个男士姓名,字符串
 
输出: 输出最具“夫妻相”的女士姓名

 
 
样例输入: li si
样例输出: li li
答案提示:  

第二题我虽然得到了正确的结果,但是做的比较麻烦,这里就不贴代码了..

 

第三题:

CandyBrush一款流行的消除游戏,在一个方阵中布满各种糖果,任意交换两个糖果,如果交换后出现横向或者竖向有连续三个相同的情况,则可以消除糖果并得分。
输入25个字符组成的字符串(编号为1到25),表示5×5的方阵,每个字符表示不同类型的糖果(区分大小写),判断是否有解,即交换某两个糖果后能够消除糖果。

举例,
下面的方阵无解
T M T M O
X R U C q
A B C X R
U R M T O
T Q C R A

下面的方阵交换(0, 2)和(1, 2)两个糖果后,能消除M
T M T M O
X R M C q
A B C X R
U R M T O
T Q C R A


如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号(1到25),比如:上面的方阵中,被交换的糖果,编号最小的为糖果“T”,编号为3。

如果无解,则输出NO。
 
运行时间限制: 无限制
内存限制: 无限制
输入: 输入25个字符组成的字符串,不含空格,表示5×5的方阵
 
输出: 如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号,以空格隔开。如果无解,则输出NO。

 
 
样例输入: TMTMOXRMCqABCXRURMTOTQCRA
样例输出: YES 3
答案提示: 输出最小糖果编号的意思,就是从左至右,从上到下遍历糖果,找到第一个跟其他交换后能消除的糖果即可。

-------------------------------------------------------------------------------------------------------------

下面是网上收集的前几年的题:

2010年华为软件校园招聘编程测验

类别:软件C语言


编程题(共2题,第一题40分,第二题60分,共100分。请上机编写程序,按题目要求提交文件。[详见考试说明]

本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。

 

1. 删除字符串中所有给定的子串(40分)

问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。

要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)

【输入】 str:输入的被操作字符串

         sub_str:需要查找并删除的特定子字符串

【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果

【返回】 删除的子字符串的个数

注:

I、   子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:

在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果

匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。

II、  输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。

示例
输入:str = "abcde123abcd123"

sub_str = "123"

输出:result_str = "abcdeabcd"

返回:2

 

输入:str = "abcde123abcd123"

sub_str = "1234"

输出:result_str = "abcde123abcd123"

返回:0

 

 

2. 高精度整数加法(60分)

问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,

参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊

的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:

 

9876543210 + 1234567890 = ?

让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。

 

-9876543210 + (-1234567890) = ?

让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。

 

要求编程实现上述高精度的十进制加法。

要求实现函数:
void add (const char *num1, const char *num2, char *result)

【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'

num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'

【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。

注:

I、   当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;

II、  输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;

III、       要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。

示例
输入:num1 = "580"

num2 = "-50"

输出:result = "530"

 

输入:num1 = "580"

num2 = "-600"

输出:result = "-20"

---------------------------------------------------------------------------------------------------------------------

(忘记从哪下的了,也懒得整理了,直接贴过来)

第一题,输入字符串长度len1,字符串s1,字符串长度len2,字符串s2。从后向前比较,以最短字符串为标准,输出不同的元素的个数。

    例如:  输入:s1="1,3,5"   len1=3        s2="2,4,1,7,5"   len2=5 

             输出:2 

    函数原型

public int getDiffNum(int len1, String s1, int len2, String s2)

 

public class HuaWeiTest { public static void main(String[] args) { String s1 = "1,3,5"; String s2 = "2,4,1,7,5"; int len1 = 3; int len2 = 5; HuaWeiTest hwt = new HuaWeiTest(); System.out.println(hwt.getDiffNum(len1, s1, len2, s2)); } public int getDiffNum(int len1, String s1, int len2, String s2) { int count = 0; int len = 0; String[] arr1 = s1.split(","); String[] arr2 = s2.split(","); if(len1 > len2) len = len2; else len = len1; for(int i=0;i<len;i++) { if(!arr1[len1-i-1].equals(arr2[len2-i-1])) { count ++; } } return count; } }


第二题,输入字符串长度,字符串,计数m。从前往后计数,当数到m个元素时,m个元素出列,同时将该元素赋值给m,然后从下一个数计数循环,直到所有数字都出列,给定的数全部为大于0的数字。输出出队队列。

    例如:  输入:len=4    str="3,1,2,4"   m=7  

             输出:2,3,1,4 

    函数原型

public String getOutString(int len, String str, int m)


import java.util.ArrayList; import java.util.List; public class HuaWeiTest { public static void main(String[] args) { int len=4; String str="3,1,2,4"; int m=7; HuaWeiTest hwt = new HuaWeiTest(); System.out.println(hwt.getOutString(len, str, m)); } public String getOutString(int len, String str, int m) { String ret =""; String[] arr = str.split(","); List<String> ls = new ArrayList<String>(); for(int i=0;i<len;i++) { ls.add(arr[i]); } for(int i=0;i<len;i++) { int temp = (m-1)%ls.size(); ret += ls.get(temp); m = Integer.parseInt(ls.get(temp))+temp; ls.remove(temp); } return ret; } }
第三题,输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。

    例如:  输入:3+8×2/9-2 

             输出:2 

    函数原型

view plain
public int getMyRet(String str)  

1、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家
评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 
0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

            函数接口   int cal_score(int score[], int judge_type[], int n)

public class SWTest { public static void main(String[] args) { int score[] = { 34,53,65,75,64 }; int judge_type[] = { 1,1,1,2,2 }; SWTest st = new SWTest(); System.out.print(st.cal_score(score, judge_type, 5)); } int cal_score(int score[], int judge_type[], int n){ int totalExpert = 0; int totalPublic = 0; int numExpert = 0; int numPublic = 0; for(int i=0;i<n;i++) { if(judge_type[i]==1) { totalExpert += score[i]; numExpert ++; } if(judge_type[i] == 2){ totalPublic += score[i]; numPublic ++; } } if(0==numPublic){ return (int)totalExpert/numExpert; }else { return (int)((totalExpert/numExpert)*0.6) + (int)((totalPublic/numPublic)*0.4); } } }  2、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output
[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
      例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}

             函数接口   void sort(int input[[, int n, int output[])

public class SWTest { public static void main(String[] args) { int input[] = {3,6,1,9,7,8}; int output[] = new int[6]; SWTest st = new SWTest(); st.sort(input, 6, output); for(int i=0;i<output.length;i++){ System.out.print(output[i]); } } void sort(int input[], int n, int output[]){ for(int i=0;i<n-1;i++){ for(int j=n-1;j>i;j--){ if(input[j]>input[j-1]) { int temp = input[j]; input[j] = input[j-1]; input[j-1] = temp; } } } int low = n/2-1; int high = n/2+1; output[n/2] = input[0]; for(int i=1;i<n;){ output[low] = input[i]; low --; i++; if(i == n) break; output[high] = input[i]; high++; i++; } } }

      3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任
务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入
队顺序排列(即先入队的任务排在前面),数组元素为-1表示结束。
      例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}    user_task[] = {4, 8, 2, 6, -1}

         函数接口    void scheduler(int task[], int n, int system_task[], int user_task[])

void scheduler(int task[], int n, int system_task[], int user_task[]){ int min = 0 ,s =0, u =0 ; for(int i=0;i<n-1;i++) { min = 0; for(int j=0;j<n;j++) { if(task[min]>task[j]) min = j; } if(task[min]<50) { system_task[s++] = min; }else if(task[min]<=255) { user_task[u++] = min; } task[min] = 300; } system_task[s]= -1; user_task[u] = -1; }
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
 1、  长度13位;
2、  以86的国家码打头;
3、  手机号码的每一位都是数字。
 请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
1)  如果手机号码合法,返回0;
2)  如果手机号码长度不合法,返回1
3)  如果手机号码中包含非数字的字符,返回2;
4)  如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int s int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】  无
【返回】  判断的结果,类型为int。
示例
输入:  inMsisdn = “869123456789“
输出:  无
返回:  1
输入:  inMsisdn = “8813912345678“
输出:  无
返回:  3
输入:  inMsisdn = “8613912345678“
输出:  无
返回:  0


public class PhoneNumber { public static void main(String[] args) { String inMsisdn = "8613912345678"; System.out.println(new PhoneNumber().verifyMsisdn(inMsisdn)); } int verifyMsisdn(String inMsisdn){ char[] inchars = inMsisdn.toCharArray(); if(inchars.length!=13) return 1; for(int i=0;i<13;i++) { if(!Character.isDigit(inchars[i])){ return 2; } } if((Character.digit(inchars[0], 10)!=8 )||(Character.digit(inchars[1], 10)!=6) ) return 3; else return 0; } }

 

文章来源:http://100049.onegrid.com.cn/T29jD97Hr4PbH.g

 

 

转载于:https://www.cnblogs.com/pandafei/p/3320821.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值