華為2017機試題
一、轉為下一個字母
給定一個字串,把字串內的字母轉換成該字母的下一個字母,a換成b,z換成a,Z換成A,如aBf轉換成bCg,字串內的其他字元不改變,給定函式,編寫函式
void Stringchang(const char*input,char*output)
其中input是輸入字串,output是輸出字串
#include <stdio.h> void stringChange(const char *input, char *output) { int i = 0; while(input[i] != '\0'){ if(input[i] == 'z' ){ output[i] = 'a'; i++; }else if(input[i] == 'Z'){ output[i] = 'A'; i++; }else{ output[i] = *(input + i) + 1; i++; } } output[i] = '\0'; } void main() { char in[] = {"abHYjlzaaZbzZ"}; char out[50]; stringChange(in, out); printf("%s\n", in); printf("%s\n", out); getchar(); }
二、判斷數字中有無相同的部分
求一個整型數字中有沒有相同的部分,例如12386123這個整型數字中相同的部分是123,相同的部分至少應該是2位數,如果有相同部分返回1,如果沒有則返回0。方法是先將整型數字轉換到陣列中,再判斷。
函式為 int same(int num),其中num是輸入的整型數字
#include <iostream>
#include <vector>
using namespace std;
int same(int num){
vector
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 main()
{
int num;
cin >> num;
cout << same(num) << endl;
system("pause");
return 0;
}
三、字串乘積
#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 main()
{
char in1[10], in2[10], out[10];
cin >> in1 >> in2;
mul(in1, strlen(in1), in2, strlen(in2), out);
cout << out << endl;
system("pause");
return 0;
}
四、麻將番數
麻將遊戲越來越受到大家喜愛,也在網路上盛行。本題目是給定一組已經和牌的麻將,編寫一個函式計算這組麻將的番數。為簡化題目,假設麻將只有筒子和條子兩種花型,能翻番的規則也只有以下三種,當一組牌中沒有下述三種情況中的一種或多種,則這組牌為0番,每種番數是加的關係,例如一組牌既有卡2條又有四歸一,則番數為3番。
1.卡2條為一番,即有一局牌是 1條2條3條;
2.四歸一為兩番,即有4張一樣的牌(花色和數字都一樣);
3.巧七對為兩番,即一組牌恰好是7對牌;
一些約定:
1.一組已經和牌的麻將由多局牌組成,一局牌可以是一對牌、3張連續同樣花色的牌、3張一樣的牌、4張一樣的牌。
2.一組已經和牌一般有14張牌,最多可以有18張牌(當有四歸一的時候)。
一字串表示已經和牌的麻將(由輸入者保證,程式設計人員無需考慮沒有和牌),如1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
說明:
1.”1T”表示1條,T表示條子,前面跟數字幾表示幾條,資料範圍1~9,輸入者保證,程式設計無需考慮輸入規範性;
2.”4D”表示4筒,D表示筒子,前面跟數字幾表示幾筒,資料範圍是1~9, 輸入者保證,程式設計無需考慮輸入規範性;
3.每局牌之間由’,’隔開,輸入者保證每局牌都是正確的且按照數字由小到大排序,程式設計人員無需判斷每局牌的正確性;
4.一組牌以’.’號結束,由輸入者保證,程式設計人員無需考慮是否有”.”號。
5.輸入保證有番數的牌在一局中,程式設計人員無需考慮排序,即有番數的牌不會分散在多局牌中。
輸出:
麻將的番數,整型型別。
樣例輸入: 1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
樣例輸出: 1
#include<iostream>
#include<string>
using namespace std;
int main()
{
char ch[42];
int gang_count = 0;
int three_same_count = 0;
int ka_2_tiao_count = 0;
int fan_count = 0;
while (cin >> ch)
{
int length = strlen(ch);
for (int i = 0; i < length; i++)
{
if (ch[i] <= '9' && ch[i] >= '1')
{
if (ch[i] == ch[i + 2] && ch[i + 2] == ch[i + 4] && ch[i + 4] == ch[i + 6] && (ch[i + 8] == ',' || ch[i + 8] == '.'))
gang_count++;
else if ((ch[i] == ch[0] || ch[i - 1] == ',') && ch[i] == ch[i + 2] && ch[i + 2] == ch[i + 4] && (ch[i + 6] == ',' || ch[i + 6] == '.'))
three_same_count++;
else if (ch[i] + 1 == ch[i + 2] && ch[i + 2] + 1 == ch[i + 4] && (ch[i + 6] == ',' || ch[i + 6] == '.'))
{
if (ch[i] == '1'&&ch[i + 1] == 'T')
ka_2_tiao_count++;
}
}
}
if (ka_2_tiao_count || three_same_count || gang_count == 4)
fan_count = ka_2_tiao_count * 1 + gang_count * 2;
else
fan_count = 2 + gang_count * 2;
cout << fan_count << endl;
}
return 0;
}