昨天华为来山大进行实习生上机考试,果断过去试了一下。题目不难,但是由于昨天紧张,没有全部做出来,今天早上总结了一下,发上来,大家参考参考,有更好的算法和答案,可以提出来大家一起交流。
第一题太过简单,就不发出来了,从第二道开始。
2.对一句话里面的单词进行reverse,标点符号位置不变。符号包括:,.!?
例:输入:Hello, my dear friend!
输出:olleH, ym raed dneirf!
以下就是我的个人简答:
#include <stack>
#include <cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
stack<char> a;
getline(cin,str);
int len=str.length();
for(int i=0;i<len;i++){
if(str[i]==' '||str[i]==','||str[i]=='.'||str[i]=='?'||str[i]=='!'||str[i]=='\n'){
string word="";
while(!a.empty()){
char ch=a.top();
a.pop();
word+=ch;
}
int wordlen=word.length();
str.replace(i-wordlen,wordlen,word);
}else{
a.push(str[i]);
}
}
cout<<str<<endl;
return 0;
}
第三道题:有一堆石子,石子数量大于2个。A和B轮流从里面取石子,A先取。第一次取石子的人不能全部取光。后一个人取的数量不能超过上一个人取的数量的2倍。取到最后一个石子的人获胜。石子数量是输入值,如果A获胜则输出2,A失败则输出1.。
例:输入:3
输出:1
我的个人解答:
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
int sum=3;
for(int i=2;;i++){
if(sum == a){
cout<<1;
break;
}
else if(sum>a){
cout<< 2;
break;
}
sum+=i;
}
return 0;
}
对第三道题进行研究,就会发现,石子数量和A(也就是先取的人)是否获胜其实是由照斐波那契数列规律决定的。所以,只要对石子数量进行判断举行了。
昨天竟然没全部做出来。。太紧张了。。大家和什么个人见解可以提出来,大家一起讨论。