108题不是很难,但是可以很好的练习输入输出。
c++的几个内置函数
islower(char c) 是否为小写字母
isuppper(char c) 是否为大写字母
isdigit(char c) 是否为数字
isalpha(char c) 是否为字母
isalnum(char c) 是否为字母或者数字
toupper(char c) 字母小转大
tolower(char c) 字母大转小
具体见:http://c.biancheng.net/view/1345.html
虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。
当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。
一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。
为了解决这个问题,可以使用一个叫做 getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
输入描述:
输入一行字符串,可以有空格
输出描述:
统计其中英文字符,空格字符,数字字符,其他字符的个数
输入
1qazxsw23 edcvfr45tgbn hy67uj m,ki89ol.\\/;p0-=\\][
输出
26
3
10
12
#include
#include
using namespace std;
int main(){
string str;
//while(cin>>str){
while(getline(cin, str)){
int english_num=0, kong_num=0, digit_num=0, other_num=0;
for(auto i:str){
// if(i>='a' && i<='z'){
if(isalpha(i)){
english_num++;
}
else if(i==' '){
kong_num++;
}
else if(isdigit(i)){
digit_num++;
}
else{
other_num++;
}
}
// if(english_num>0) cout<
//if(kong_num>0) cout<
//if(digit_num>0) cout<
cout<<english_num<<endl<<kong_num<<endl<<digit_num<<endl<<other_num<<endl;
}
return 0;
}
题目描述
定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
示例1
输入
复制
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出
复制
(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)
#include
#include
using namespace std;
int N, M; //分别代表行和列
vector<vector<int>> maze;//迷宫矩阵
vector<vector<int>> path_temp;//存储当前路径,第一维表示位置
vector<vector<int>> path_best;//存储最佳路径
void MazeTrack(int i, int j)
{
maze[i][j] = 1;//表示当前节点已走,不可再走
path_temp.push_back({ i, j });//将当前节点加入到路径中
if (i == N - 1 && j == M - 1) //判断是否到达终点
if (path_best.empty() || path_temp.size() < path_best.size())
path_best = path_temp;
if (i - 1 >= 0 && maze[i - 1][j] == 0)//探索向上走是否可行
MazeTrack(i - 1, j);
if (i + 1 < N && maze[i + 1][j] == 0)//探索向下走是否可行
MazeTrack(i + 1, j);
if (j - 1 >= 0 && maze[i][j - 1] == 0)//探索向左走是否可行
MazeTrack(i, j - 1);
if (j + 1 < M && maze[i][j + 1] == 0)//探索向右走是否可行
MazeTrack(i, j + 1);
//当程序执行到这里的时候,说明某个点的上下左右4个方向都不能走(或走过了),那么就可以执行下面的恢复现场了。
maze[i][j] = 0; //恢复现场,设为未走
path_temp.pop_back(); //顺便把路径里的那个点pop掉
}
int main()
{
while (cin >> N >> M)
{
maze = vector<vector<int>>(N, vector<int>(M, 0));
path_temp.clear();
path_best.clear();
for (auto &i : maze)
for (auto &j : i)
cin >> j; //从开始到这儿是手动输入一个二维矩阵
MazeTrack(0, 0);//回溯寻找迷宫最短通路
for (auto i : path_best)//按输出格式输出
cout << '(' << i[0] << ',' << i[1] << ')' << endl;//输出通路
}
return 0;
}
输入描述:
输入一串字符。
输出描述:
对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
示例1
输入
aadddccddc
输出
dca
第一步: 使用map<char, int> 统计每个字符的个数, map默认按字典排序
第二步: 将map中的数据拷贝到vector<pair<char, int> > 中
第三步: 使用stable_sort()排序, 注意需要自己传入谓词, 以便按照字符数量大小排序
#include
#include
#include
#include
#include
using namespace std;
bool isSorter(const pair<char, int> &s1, const pair<char, int> &s2) {
return s1.second > s2.second;
}
int main() {
string str;
while (cin >> str) {
map<char, int> mp;
for (auto i : str) {
mp[i]++;
}
vector<pair<char, int>> tmp(mp.begin(), mp.end());
stable_sort(tmp.begin(), tmp.end(), isSorter);
for (auto p : tmp) {
cout << p.first;
}
cout << endl;//没有这个通不过,因为也是为了输入多个测试案例,输完一组,换行才能输入第二组数据
}
return 0;
}