华为机试题
目录
例1:字符串加密
题目描述:
有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。
详细描述:
接口说明
原型:
voidencrypt(char * key,char * data,char * encrypt);
输入参数:
char * key:密匙
char * data:明文
输出参数:
char * encrypt:密文
返回值:
void
输入描述:
先输入key和要加密的字符串
输出描述:
返回加密后的字符串
示例1
输入
nihao
ni
输出
le
代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string key,s;
while(cin>>key>>s){
string r;
int p[26]={0};
for(int i=0;i<key.length();i++){
if(key[i]>='a'&&key[i]<='z'){
if(p[key[i]-'a']==0){
r+=key[i]-32; //转化为对应大写字母
p[key[i]-'a']=1;
}
}
else{
if(p[key[i]-'A']==0){
r+=key[i];
p[key[i]-'A']=1;
}
}
}
for(int i=0;i<26;i++){
if(p[i]==0){
r+=i+'A';
}
}
for(int i=0;i<s.length();i++){
if(s[i]>='a'){
char c=r[s[i]-'a']+32;
cout << c;
}
else{
char c=r[s[i]-'A'];
cout << c;
}
}
cout << endl;
}
return 0;
}
解析:用于大小写转换的,大写字母和小写字母的 ASCII 编码值差32,不过貌似我印象中是小写字母减32就是对应的大写字母,比如 'a' - 32 的结果就是 'A'
例2:统计每个月兔子的总数
题目描述:
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
/**
* 统计出兔子总数。
*
* @param monthCount 第几个月
* @return 兔子总数
*/
public static int getTotalCount(int monthCount)
{
return 0;
}
输入描述:
输入int型表示month
输出描述:
输出兔子总数int型
示例1
输入
9
输出
34
思路:递推公式 f(n)=f(n-1)+f(n-2) (n>3),解释:对于第n个月的兔子数量:有两部分组成,一部分是上个月的兔子f(n-1),另一部是满足3个月大的兔子会生一只兔子f(n-2)。
代码:
#include <iostream>
using namespace std;
int getTotalCount(int month){
int count;
if(month<3){
count=1;
}
else{
count=getTotalCount(month-1)+getTotalCount(month-2);
}
return count;
}
int main(){
int month;
while(cin>>month){
cout<< getTotalCount(month) << endl;
}
return 0;
}
例3:求小球落地的路程和反弹高度
题目描述:
假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?
/**
* 统计出第5次落地时,共经过多少米?
*
* @param high 球的起始高度
* @return 英文字母的个数
*/
public static double getJourney(int high)
{
return 0;
}
/**
* 统计出第5次反弹多高?
*
* @param high 球的起始高度
* @return 空格的个数
*/
public static double getTenthHigh(int high)
{
return 0;
}
输入描述:
输入起始高度,int型
输出描述:
分别输出第5次落地时,共经过多少米第5次反弹多高
示例1
输入
1
输出
2.875
0.03125
代码:
#include <iostream>
using namespace std;
double getTotal(int height){
double high=double(height);
double sum=high;
for(int i=1;i<=4;i++){
high/=2;
sum+=2*high;
}
return sum;
}
double getFifth(int height){
double high=double(height);
double bounce=0;
for(int i=0;i<5;i++){
high/=2;
bounce=high;
}
return bounce;
}
int main(){
int height;
while(cin>>height){
cout << getTotal(height) << endl;
cout << getFifth(height) << endl;
}
return 0;
}
考虑不到5次已经落地的情况,修改代码如下:
#include <iostream>
using namespace std;
double getTotal(int height){
double high=double(height);
double sum=high;
for(int i=1;i<=4;i++){
high/=2;
sum+=2*high;
}
return sum;
}
double getFifth(int height){
double high=double(height);
double bounce=0;
int i=0;
for(;i<5;i++){
high/=2;
if(high==0){
break;
}
bounce=high;
}
if(i!=5){
bounce=0;
}
return bounce;
}
int main(){
int height;
while(cin>>height){
cout << getTotal(height) << endl;
cout << getFifth(height) << endl;
}
return 0;
}