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