华为上机题汇总(二)
2016-08-08 22:58
330 查看
华为上机题汇总(二)
注:编译环境为Visual Studio 2012,答案仅供参考。目录
华为上机题汇总二目录
第六题
第七题
第八题
第九题
第十题
第六题
6.比较一个数组的元素 是否为回文数组(如abcdcba,hjjh)#include <iostream> #include <vector> #include <string> using namespace std; bool isPalindrome(const string &str){ int length = str.size(); for (int i = 0; i < length/2; i++) { if (str[i] != str[length - i - 1]) { return false; } } return true; } int _tmain(int argc, _TCHAR* argv[]) { string s; getline(cin,s); cout << isPalindrome(s) << endl; return 0; }
第七题
7.比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3
• 要求实现函数:
int array_compare(int len1, int array1[], int len2, int array2[])
【输入】 int len1:输入被比较数组1的元素个数;
int array1[]:输入被比较数组1;
int len2:输入被比较数组2的元素个数;
int array2[]:输入被比较数组2;
【输出】 无
【返回】 不相等元素的个数,类型为int
• 示例
1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5
函数返回:0
2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6
函数返回:3
#include <iostream> #include <vector> #include <string> using namespace std; int array_compare(int len1,int array1[],int len2,int array2[]){ int count = 0; if (len1 < len2) { return array_compare(len2,array2,len1,array1); } for(int i = len2-1; i >= 0;i --){ if (array1[len1-1] != array2[len2-1]) { count++; } } return count; } int _tmain(int argc, _TCHAR* argv[]) { int array1[] = {1,3,5}; int len1 = 3; int array2[] = {77,21,1,3,5,7}; int len2 = 6; cout << array_compare(len1,array1,len2,array2) << endl; return 0; }
第八题
8.约瑟夫环变种:输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
• 要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
【返回】 无
• 示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}
#include <iostream> using namespace std; int removeElement(int input_array[],int length,int index){ int popNum = input_array[index]; for (int i = index; i < length - 1; i++) { input_array[i] = input_array[i+1]; } return popNum; } void array_iterate(int len,int input_array[],int m,int output_array[]){ int length = len; int startNum = 0, i = 0; while (length > 1) { int popIndex = (startNum + m - 1) % length; int popNum = removeElement(input_array,length--,popIndex); startNum = popIndex % length; m = popNum; output_array[i] = popNum; cout << output_array[i++] << endl; } output_array[i] = input_array[0]; cout << output_array[i] << endl; } int _tmain(int argc, _TCHAR* argv[]) { int array[] = {3,1,2,4}; int len = 4; int m = 7; int out_array[4]; array_iterate(len,array,m,out_array); return 0; }
第九题
9.手机号码合法性:问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “8819123456789“
输出: 无
返回: 3
输入: inMsisdn = “8619123456789“
输出: 无
返回: 0
#include <iostream> using namespace std; int verifyMsisdn(char *inMsisdn){ if (strlen(inMsisdn) != 13) { return 1; } char *p = inMsisdn; while (*p != '\0') { if ((*p < '0')||(*p > '9')) { return 2; } *p++; } if ((inMsisdn[0] != '8')||(inMsisdn[1] != '6')) { return 3; } return 0; } int _tmain(int argc, _TCHAR* argv[]) { char in[100]; cin.getline(in,100); cout << verifyMsisdn(in) << endl; return 0; }
第十题
问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注: 1、表达式只含 +, -, *, /, (, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
• 要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
• 示例
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6
#include <iostream> #include <stack> using namespace std; int calculate(int len, char *expStr){ stack<int> numberStack; stack<char> operatorStack; while (*expStr != '\0') { if ((*expStr >= '0')&&(*expStr <= '9')) { numberStack.push(*expStr++ - '0'); } else if ((*expStr == '+')||(*expStr == '-')) { if (operatorStack.empty()) { operatorStack.push(*expStr++); } else { int num2 = numberStack.top(); numberStack.pop(); int num1 = numberStack.top(); numberStack.pop(); char op = operatorStack.top(); operatorStack.pop(); int result; if (op == '+') { result = num1 + num2; } else { result = num1 - num2; } numberStack.push(result); operatorStack.push(*expStr++); } } else if ((*expStr == '*')||(*expStr == '/')) { int num1 = numberStack.top(); numberStack.pop(); char op = *expStr++; int num2; if (*expStr == '(') { unsigned length = strlen(expStr); for (int i = length - 1; i > 0; i--) { if (expStr[i] == ')') { char temp[100]; for (int j = 1; j < i; j++) { temp[j-1] = expStr[j]; } temp[i-1] = '\0'; num2 = calculate(strlen(temp),temp); expStr += i+1; break; } } } else { num2 = *expStr++ - '0'; cout << num2 << endl; } int result; if (op == '*') { result = num1 * num2; } else { result = num1 / num2; } numberStack.push(result); } else if (*expStr == '('){ unsigned length = strlen(expStr); for (int i = length - 1; i > 0; i--) { if (expStr[i] == ')') { char temp[100]; for (int j = 1; j < i; j++) { temp[j-1] = expStr[j]; } temp[i-1] = '\0'; int result = calculate(strlen(temp),temp); numberStack.push(result); expStr += i+1; break; } } } } if (!operatorStack.empty()) { int num2 = numberStack.top(); numberStack.pop(); int num1 = numberStack.top(); numberStack.pop(); char op = operatorStack.top(); operatorStack.pop(); int result; if (op == '+') { result = num1 + num2; } else { result = num1 - num2; } numberStack.push(result); } int result = numberStack.top(); numberStack.pop(); return result; } int _tmain(int argc, _TCHAR* argv[]) { char exp[100]; cin.getline(exp,100); cout << calculate(strlen(exp),exp) << endl; return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 华为路由器密码恢复
- 华为交换机的后缀详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例