博客
关于我
2014华为机试真题(2)
阅读量:798 次
发布时间:2023-04-16

本文共 8780 字,大约阅读时间需要 29 分钟。

函数int same(int num)中,首先将整型数字转换为数组data,保存每一位数字。然后,根据数字长度判断是否至少为4位。接着,通过循环移位法,检查是否存在至少两位相同的部分。

1. 数字是否存在相同部分

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数。如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。

函数为`int same(int num)`,其中num是输入的整型数字。

使用循环移位法。如,每次全扫描匹配一次。至外循环为length-2次。

12345678 12345678  12345678 12345678 12345678 12345678 

78123456 67812345  56781234 45678123 34567812 23456781 

int same(int num) {    int data[100];    int length = 0;    int count = 0;    while (num > 0) {        data[length++] = num % 10;        num /= 10;    }    if (length < 4)        return 0;    for (int i = 2; i < length; i++) {        int j = 0;        while (j < length - i) {            if (data[i + j] == data[j]) {                count++;                if (count >= 2)                    return 1;            } else {                count = 0;            }            j++;        }    }    for (int i = length - 2; i >= 0; i--) {        int j = 0;        while (j < length - i) {            if (data[i + j] == data[length - i + j]) {                count++;                if (count >= 2)                    return 1;            } else {                count = 0;            }            j++;        }    }    return 0;}

2. 识别字符串中的整数并转换为数字形式

问题描述:

识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。

要求实现函数:

void take_num(const char *strIn, int *n, unsigned int *outArray)

【输入】 strIn:输入的字符串

【输出】 n:统计识别出来的整数个数

outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,依此类推。

【返回】无

注:

I、不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)

II、不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围

III、需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)

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

示例:

输入:strIn = "ab00cd+123fght456-25  3.005fgh"

输出:n = 6

outArray = {0, 123, 456, 25, 3, 5}

void take_num(const char *strIn, int *n, unsigned int *outArray) {    if (strIn.empty())        return;    int i = 0;    bool flag = false;    while (i < strlen(strIn)) {        if (!isdigit(strIn[i]) && !flag) {            flag = true;            i++;            continue;        }        if (isdigit(strIn[i])) {            unsigned int num = 0;            while (isdigit(strIn[i])) {                num = num * 10 + (strIn[i] - '0');                i++;            }            if (flag) {                flag = false;                if (num != 0 || (num == 0 && outArray[0] == 0)) {                    if (outArray[0] == 0 && num == 0) {                        outArray[0] = 0;                    } else {                        outArray[0] = num;                    }                    *n += 1;                }                if (outArray[1] == 0 && num == 0) {                    outArray[1] = 0;                } else {                    outArray[1] = num;                }                *n += 1;            } else {                if (outArray[0] == 0 && num == 0) {                    outArray[0] = 0;                } else {                    outArray[0] = num;                }                *n += 1;            }        }    }}

3. 计算字符串

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

1. 操作数为正整数,不需要考虑计算结果溢出的情况。

2. 若输入算式格式错误,输出结果为“0”。

示例:

输入:“4 + 7”  输出:“11”

输入:“4 - 7”  输出:“-3”

输入:“9 ++ 7”  输出:“0”  注:格式错误

#include 
#include
using namespace std;bool getNum(const char *p, int &result) { if (!p || *p < '0' || *p > '9') { return false; } else { result = 0; while (*p >= '0' && *p <= '9') { result = result * 10 + (*p - '0'); p++; } return true; }}int jisuan(const char *s) { if (!s || !isdigit(*s)) { return 0; } int left = 0, right = 0; bool flag = true; bool flagOpt = true; while (*s != '\0') { if (flagOpt && isdigit(*s) && getNum(s, right) && (*s == ' ' || *s == '\0')) { if (flag) { left = left + right; } else { left = left - right; } flagOpt = false; if (*s == ' ') { s++; } } else if (!flagOpt && (*s == '+' && s[1] == ' ')) { flag = true; flagOpt = true; s += 2; } else if (!flagOpt && (*s == '-' && s[1] == ' ')) { flag = false; flagOpt = true; s += 2; } else { return 0; } } return left;}int main() { string s; getline(cin, s); int result = jisuan(s.c_str()); cout << result << endl;}

4. 身高差值最小

要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。

Sample input:161 189 167 172 188 Sample outPut: 188189

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}template
int choose(int (&data)[N]) { if (N <= 1) { return -1; } qsort(data, N, sizeof(int), cmp); int index = 0; int min = data[1] - data[0]; for (int i = 1; i < N; i++) { if (data[i] - data[index] < min) { min = data[i] - data[index]; index = i; } } return index;}

5. 确定数字中有某个数字并排序

输入一行数字:123 423 5645 875 186523

在输入第二行:23

将第一行中含有第二行中“23”的数输出并排序结果即:123 423 186523

#include 
#include
#include
#include
using namespace std;int compare(const void *arg1, const void *arg2) { return *(int *)arg1 - *(int *)arg2;}bool decision(int num, const string &key) { char *p = new char[10]; memset(p, 0, 10); itoa(num, p, 10); string s(p); return s.find(key) != string::npos;}void main() { vector
vec; int temp; while (cin >> temp) { vec.push_back(temp); if (cin.get() == '\n') { break; } } string key; getline(cin, key); for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (!decision(*iter, key)) { iter = vec.erase(iter); } else { ++iter; } } sort(vec.begin(), vec.end()); for (int i = 0; i < vec.size(); i++) { if (!decision(vec[i], key)) { vec.erase(vec.begin() + i); i--; } } sort(vec.begin(), vec.end()); for (int num : vec) { if (decision(num, key)) { cout << num << " "; } } cout << endl;}

6. 输入整型数组求数组的最小数和最大数之和

输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50

int process() {    int temp;    cin >> temp;    int min = max = temp;    char c = getchar();    while (c != '\n') {        cin >> temp;        if (temp > max) {            max = temp;        } else if (temp < min) {            min = temp;        }        c = getchar();    }    return min + max;}

7. 数组中数字两两相同,有两个不同,找出这两个

#include 
#include
using namespace std;int main() { vector
vec; int temp; char ch = getchar(); while (ch != '\n') { vec.push_back(temp); cin >> temp; ch = getchar(); } vec.push_back(temp); temp = 0; for (int i = 0; i < vec.size(); i++) { if (vec[i] != temp) { temp = vec[i]; vec.push_back(temp); } } vec.erase(unique(vec.begin(), vec.end()), vec.end()); if (vec.size() != 2) { cout << "0" << endl; } else { if (vec[0] == vec[1]) { cout << "0" << endl; } else { cout << vec[0] << vec[1] << endl; } }}

8. 超过数组长度一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

#include 
#include
using namespace std;int main() { vector
vec; int temp; char ch = getchar(); while (ch != '\n') { vec.push_back(temp); cin >> temp; ch = getchar(); } vec.push_back(temp); if (vec.size() % 2 == 0) { int half = vec.size() / 2; } else { int half = vec.size() / 2 + 1; } map
countMap; for (int num : vec) { countMap[num]++; } for (auto pair : countMap) { if (pair.second > half) { cout << pair.first << endl; return; } } cout << "0" << endl;}

9. 字符串首字母转换成大写

#include 
#include
using namespace std;void convert(string &s) { if (s.empty()) { return; } int i = 0; while (i < s.size()) { if (s[i] >= 'a' && s[i] <= 'z') { s[i] = s[i] - 'a' + 'A'; } i++; }}

转载地址:http://cygfk.baihongyu.com/

你可能感兴趣的文章
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
MYSQL 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>