华为提前批机试题整理
1. 输入字符串,输出字符串中重复出现过的字符,每个只输出一次
思路:
将出现过的字符生成一个字典,并统计出现次数,超过一次出现的直接输出
-
#include<iostream> #include<string> usingnamespace std; int main(){ string inputStr; string dicStr; string tempStr; std::size_t found; int countArray[52]={0};//用于记录出现次数 cin >> inputStr; //生成一个出现过字符的dic,并记录出现次数 for(int i =0; i < inputStr.size(); i++){ found = dicStr.find(inputStr[i]); if(found != std::string::npos){ countArray[found]++; //如果出现次数超过一次,直接输出 if(countArray[found]>1){ cout << dicStr[found]; } } else{ countArray[dicStr.size()]++; dicStr.push_back(inputStr[i]); } } return0; }
2. 输入一串数字(以“,”号相分隔),将数组降序排序,如果有连续数字则只输出两头的两个数字
思路:
排序后的数组去掉头尾的所有元素判断一下与前后相邻两个数的差是否为1
-
#include<iostream> #include<sstream> #include<string> #include<algorithm> #include<vector> usingnamespace std; int main() { string inputStr; string tempStr;//存储相邻逗号之间的所有字符 stringstream tempStream; int tempData; vector<int> numArray; cin >> inputStr; for(int i =0; i <= inputStr.size();i++)//inputStr最后一个字符是'\0' { if(inputStr[i]!=','&&inputStr[i]!='\0') { tempStr += inputStr[i]; } else {//用sstream将字符串转为数字 tempStream << tempStr; tempStream >> tempData; numArray.push_back(tempData); tempStr.clear(); tempData =0; tempStream.clear(); } } //降序排序 sort(numArray.begin(), numArray.end()); reverse(numArray.begin(), numArray.end()); cout << numArray.front()<<','; for(int i =1; i < numArray.size()-1;i++) {//前后有相邻数字的不输出 if((numArray[i-1]-numArray[i])==1 &&(numArray[i]-numArray[i+1])==1) continue; cout << numArray[i]<<','; } cout << numArray.back(); return0; }
3. 输入字符串,输出出现过的字符。
思路:
用unique函数实现
-
#include<iostream> #include<string> #include<algorithm> usingnamespace std; int main() { string inputStr; cin >> inputStr; string::iterator it; it = unique(inputStr.begin(), inputStr.end());//将字符串重新排序,迭代器定位在第一个重复字符处 inputStr.resize(distance(inputStr.begin(), it));//删除后面的多余字符 cout << inputStr; return0; }
4.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
思路:
-
int main() { string inputStr; cin >> inputStr; char curChar; int repeatCount =1; for(int i =1; i <= inputStr.size(); i++) { if(inputStr[i]==inputStr[i-1]) { repeatCount++; } else {//如果当前字符变化则输出前一个字符 if(repeatCount >1) { cout << repeatCount; } cout << inputStr[i -1]; repeatCount =1; } } }
5.通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
思路:
遍历字符串,用sstream读入数字(不需要考虑正负),用一个char保留运算符
-
#include<iostream> #include<string> #include<algorithm> #include<sstream> usingnamespace std; int main() { string inputStr; stringstream stream; char operatorStr; int numCnt =0; int numArray[2]={0,0}; cin >> inputStr; string::iterator it = inputStr.begin(); do { if(*it >='0'&&*it <='9'||*it =='-') { stream <<*it++; } elseif(*it =='+'||*it =='-'||*it =='\n') { stream >> numArray[numCnt++]; stream.clear(); operatorStr =*it++; } else it++; continue; }while(it != inputStr.end()); if(stream) { stream >> numArray[numCnt++]; stream.clear(); } switch(operatorStr) { case'+': cout << numArray[0]+ numArray[1]; break; case'-': cout << numArray[0]- numArray[1]; break; default: cout <<0; break; } return0; }
6.
描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。
输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1
#include<iostream> #include<vector> #include<string> #include<numeric> usingnamespace std; void main() { int num; cin >> num; vector<int> lampArray(num,0); for(int i =1; i <= num;i++) {//大循环:n个学生 auto it = lampArray.begin(); int j =1; while(it!=lampArray.end()) {//小循环:遍历所有灯 if(j%i ==0) { *it =!*it; } j++; it++; } } cout << accumulate(lampArray.begin(), lampArray.end(),0); }
浙公网安备 33010602011771号