华为上机题汇总(一)
注:编译环境为Visual Studio 2012,答案仅供参考。
目录
- 华为上机题汇总一
- 目录
- 第一题
- 第二题
- 第三题
- 第四题
- 第五题
第一题
1.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数
void Stringchang(const char *input,char *output)
其中input是输入字符串,output是输出字符串
#include <stdio.h>
#include <iostream>
using namespace std;
void Stringchang(const char* input,char* output){
int length = strlen(input);
while (*input != ‘\0‘)
{
if ((*input < ‘z‘ && *input >= ‘a‘) || (*input < ‘Z‘ && *input >= ‘A‘))
{
*output++ = *input++ + 1;
}
else if (*input == ‘z‘ || *input == ‘Z‘)
{
*output++ = *input++ - 25;
}
else
{
*output++ = *input++;
}
}
*output = ‘\0‘;
}
int _tmain(int argc, _TCHAR* argv[])
{
char in[100];
char out[100];
cin.getline(in,100);
Stringchang(in,out);
cout << out << endl;
return 0;
}
第二题
2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。
函数为 int same(int num)
其中num是输入的整型数字
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int same(int num){
vector<int> temp;
while (num != 0)
{
int tempNum = num % 10;
temp.push_back(tempNum);
num = num / 10;
}
if (temp.size() <= 1)
{
return 0;
}
for (auto begin = temp.rbegin(), end = temp.rend(), ahead = begin + 1; begin != end; begin++)
{
while (ahead+1 != end)
{
if (*ahead != *begin)
{
ahead++;
continue;
}
if (*(ahead+1) == *(begin+1))
{
return 1;
}
ahead++;
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int num;
cin >> num;
cout << same(num) << endl;
return 0;
}
第三题
3.求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来
函数为 void mul(char *input1,int n,char *input2, int m,char *output)
其中input1和input2是输入,n是input1的长度,n2是input2的长度。Output是输出
注:题目中要求字符串中的字符转换为整型数字,说明不考虑无法转换即大数问题的情况。
#include <stdio.h>
#include <iostream>
using namespace std;
void mul(char *input1,int n,char *input2,int m,char *output){
long long num1 = 0, num2 =0;
for (int i = 0; i < n; i++)
{
num1 += (input1[i] - ‘0‘) * pow(10,n-i-1);
}
for (int i = 0; i < m; i++)
{
num2 += (input2[i] - ‘0‘) * pow(10,m-i-1);
}
long long num3 = num1 * num2;
char *p = output;
while (num3 != 0)
{
*p++ = num3 % 10 + ‘0‘;
num3 /= 10;
}
*p = ‘\0‘;
int length = strlen(output);
for (int i = 0; i < length/2; i++)
{
int temp = output[i];
output[i] = output[length - i -1];
output[length - i -1] = temp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char in1[10], in2[10], out[10];
cin >> in1 >> in2 ;
mul(in1,strlen(in1),in2,strlen(in2),out);
cout << out << endl;
return 0;
}
由于输入的字符串不一定都是数字,最好再增加一个全局变量用于表示输入是否合法
第四题
4.删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int deleteSubstr(string &str,const string &sub){
int count = 0;
string::size_type length = sub.size();
if (str.size() < length)
{
return count;
}
string tempString;
auto begin = str.begin();
for (auto end = str.end();(end - begin) >= length;)
{
string tempSub(begin, begin + length);
if (tempSub == sub)
{
count++;
begin += length;
continue;
}
tempString.push_back(*begin++);
}
while (begin != str.end())
{
tempString.push_back(*begin++);
}
str.clear();
str.assign(tempString.begin(),tempString.end());
return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
string s1,s2;
cin >> s1 >> s2;
cout << deleteSubstr(s1,s2) << s1 << endl;
return 0;
}
第五题
5.约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
void cycle(int n, int k, int m){
if (k > n)
{
// error
return;
}
vector<int> v;
for (int i = 0; i < n; i++)
{
v.push_back(i+1);
}
while (v.size() > 1)
{
int popNum = (k-1+m-1)%v.size();
k = (popNum+1)%(v.size()-1);
cout << v[popNum] << endl;
v.erase(v.begin()+popNum);
}
cout << v[0] << endl;
v.clear();
}
int _tmain(int argc, _TCHAR* argv[])
{
int n,k,m;
cin >> n >> k >> m;
cycle(n,k,m);
return 0;
}