華為2015機試題
一、字串分解
按要求分解字串,輸入兩個數M,N;M代表輸入的M串字串,N代表輸出的每串字串的位數,不夠補0。例如:輸入2,8, “abc” ,“123456789”,則輸出為“abc00000”,“12345678“,”90000000”
分析思路:
容易題
1.獲得字串的長度length後,判斷與要輸出位數N的大小,大於N的話,直接printf前N位字元,然後length-=N;
2.再次迴圈判斷與要輸出位數N的大小,如果小於N的話,輸出length個字元和n-length個0字元。
3.重複迴圈直到length<0。
#include <iostream>
using namespace std;
void resolve(char *str, int N){
int length = strlen(str); //獲得字串的長度length
char strtemp[255];
while (length>0){
if (length >= N) //大於N,直接printf前N位字元
{
int i;
for (i = 0; i<N; i++)
{
strtemp[i] = *str;
str++;
}
strtemp[i] = '\0';
}
else //小於N,輸出length個字元和n-length個0字元
{
int i;
for (i = 0; i<length; i++)
{
strtemp[i] = *str;
str++;
}
for (i = length; i<N; i++)
{
strtemp[i] = '0';
}
strtemp[i] = '\0';
}
cout << strtemp << " ";
length -= N;
}
}
int main(){
int M, N;
char str[255];
cin >> M >> N;
for (int i = 0; i<M; i++)
{
cin>>str;
resolve(str, N);
}
system("pause");
return 0;
}
二、拼音轉數字
輸入是一個只包含拼音的字串,請輸出對應的數字序列。轉換關係如下:
描述: 拼音 yi er san si wu liu qi ba jiu
阿拉伯數字 1 2 3 4 5 6 7 8 9
輸入字元只包含小寫字母,所有字元都可以正好匹配
執行時間限制:無限制
記憶體限制: 無限制
輸入: 一行字串,長度小於1000
輸出: 一行字元(數字)串
樣例輸入: yiersansi
樣例輸出: 1234
#include<iostream>
#include<vector>
using namespace std;
void convert(vector<char> input)
{
int i;
int length = input.size();
for (i = 0; i < length;)
{
switch (input[i])
{
case 'y':
cout << "1";
i += 2;
break;
case 'e':
cout << "2";
i += 2;
break;
case 's':
if (input[i + 1] == 'a')
{
cout << "3";
i += 3;
}
else
{
cout << "4";
i += 2;
}
break;
case 'w':
cout << "5";
i += 2;
break;
case 'l':
cout << "6";
i += 3;
break;
case 'q':
cout << "7";
i += 2;
break;
case 'b':
cout << "8";
i += 2;
break;
case 'j':
cout << "9";
i += 3;
break;
}
}
printf("\n");
}
int main()
{
char c;
vector<char> str;
while (cin >> c)
{
str.push_back(c);
}
convert(str);
system("pause");
return 0;
}
三、去除重複字元並排序
執行時間限制:無限制
內容限制: 無限制
輸入: 字串
輸出: 去除重複字元並排序的字串
樣例輸入: aabcdefff
樣例輸出: abcdef
#include <iostream>
#include <map>
using namespace std;
void fun(char *str){
map<char, int> m;
int length = strlen(str);
for (int i = 0; i<length; i++)
{
m[str[i]] += 1;
}
map<char, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
{
cout << (*it).first;
}
cout << endl;
}
int main(){
char str[255];
while (cin >> str)
{
fun(str);
}
return 0;
}
四、等式轉換
輸入一個正整數X,在下面的等式左邊的數字之間新增+號或者-號,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
請編寫程式,統計滿足輸入整數的所有整數個數。
輸入: 正整數,等式右邊的數字
輸出: 使該等式成立的個數
樣例輸入:5
樣例輸出:2
#include <cstdio>
#include <iostream>
using namespace std;
const char sym[3] = { ' ', '+', '-' };
int target = 0, hitCount = 0, flag = 1;
char opts[10];
/*
* lastSum,curRes分別儲存上一個符號之前的計算結果與當前的數字結果,
* 如1+2+345搜尋到4的時候lastSum儲存1+2+3的結果,curRes儲存34
* flag儲存正負號相關的計算因子
*/
void Recursive_permutation(int lastSum, int curRes, char curOpt, int curNum)
{
/* 這行程式碼用於記錄結果運算子*/
opts[curNum] = curOpt;
if (curOpt == sym[0])
{
curRes = curRes * 10 + flag * curNum;
}
else
{
lastSum += curRes;
flag = (curOpt == sym[1]) ? 1 : -1;
curRes = flag * curNum;
}
if (curNum == 9)
{
lastSum += curRes;
if (lastSum == target)
{
++hitCount;
/* 這段程式碼用於列印結果式子進行對照 */
for (int i = 1; i <= 9; i++)
{
if (opts[i] != ' ')
{
cout << opts[i];
}
cout << i;
}
cout << endl;
}
lastSum = curRes = 0;
flag = 1;
}
else
{
for (int i = 0; i < 3; i++)
{
int newNum = curNum + 1;
Recursive_permutation(lastSum, curRes, sym[i], newNum);
}
}
}
int main()
{
cin >> target;
Recursive_permutation(0, 0, ' ', 1);
cout << hitCount << endl;
system("pause");
}