提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
读入一个字符串,字符串以逗号分割,字符串有且仅有5位数字。字符如果出现0,则可以替换1-9中的任意数字。字符串中最多出现两个0
前言
这道题试我在笔试的时候做的一道题,现总结如下:
一、字符串读入加转换
1.读数据
思想:题目中输入的时以,号分隔的字符串,我们将其读入,去掉其,字符并放入int型数组容器中,以便后续处理。
这里主要用到了3个函数
1 stringstream
来自库函数
实现字符串分割功能:
string s=“hello world”;
stringstream ss(s1);
string s2;
while(getline(ss,s2, ‘ ,’ ))
{
cout<<s2<<endl;
}
2 getline,cin
1.cin.getline()实际上有三个参数,cin.getline(接收字符串的变量,接收字符个数,结束字符),2、当第三个参数省略时,系统默认为’\0
2.getline()
用法:接收一个字符串,可以接收空格并输出,需包含“#include”
string str;
getline(cin,str);
cout<<str<<endl;
geline(ss,str,’ ')//ss为stringstream流的对象
3 stoi和atoi
头文件#include
stoi:可以直接将字符串转化为int输出 stoi(“3”):可以直接操作字符串,同时对int范围检查,不在范围出错
atoi:atoi(s.c_str()) 参数常量字符指针,如果时字符串的话需要先经过c_str()函数才能用。 需要将字符串转化再使用。
2.本题读入
#include<sstream>
#include<vector>
vector<int>vs;
string s;
cin>>s;
stringstream ss(s);//把读入的字符串放入ss中
string str;//定义一个str接收分割之后的字符串
while(getline(ss,str,','))//将读入的字符串用geline函数以,为分隔符分割读入
{
vs.push_back(stoi(str))//将读入的字符转化为int型放入vs数组容器中,
}
//这样我们就可以得到一个处理好的int型数组,以便后续对其进行排序和判断。
二、判断是否为顺子
2.1 剑指offer(61)解析
本题和这道题判断顺子的思路差不多,我们先来看一下剑指offer的题
首先:判断顺子我们需要对其进行排序,顺子必有序。
其次分析问题:判断顺子成立只需两个条件:
1.没有重复数字(有重复数字时候,不管有没有0都可以认为是非顺子)
2.当没有重复数字时,不管数组中是否有1个0,2个0,或者没有0,顺子成立的条件为,除去0以后数组中最大元素减去最小元素即为a=nums[4]-nums[i],i为排序后第一个非0元素的索引,只要满足a<=4即为顺子。
3.特殊情况全为0也是顺子
这里解释一下第2点:
最大值hight-最小值val+1 =5,证明我们需要5个数才能保证连续的顺子
如果 hight -val +1>5 ,证明我们需要大于5个数才能保证连续,然而我们的数组长度是固定的5,所以大于5时候不满足,只有当hight -val +1<=5时才满足顺子的条件,hight-val<=4即可。
class Solution
{
public:
bool isStraight(vector<int>&nums)
{
sort(nums.begin(),nums.end());
int i=0;
while(i<nums.size()&&nums[i]==0) i++;
if(i == nums.size()) return true;
//只需要判断相邻的元素是否相当即可知道是否存在重复数字
for(int j =i;j<4;j++)
{
if(nums[j]==nums[j+1]) return false;
}
return nums[4]-nums[i]<=4;
}
};
三.本题完整答案
#include<iostream>
#include<unordered_map>
#include<vector>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
//#include<cstring>
#include<algorithm>
#include<unordered_map >
#include<iomanip>
#include<sstream>
//#include<iostream>
//#include<unordered_map>
//#include<vector>
//#include<string>
//#include<vector>
//#include<map>
//#include<cstring>
//#include<algorithm>
#include"stdafx.h"
#include<bits/stdc++.h>
using namespace std;
void printb(bool t)
{
if (t == true) cout << "so luck!"<<endl;
else cout << "oh ,my gard!" << endl;
}
bool select(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int i = 0;
while (i < nums.size() && nums[i] == 0) i++;
cout << i << endl;
if (i == nums.size()) return true;
for (int j = i; j < 4; j++)
{
if (nums[j] == nums[j + 1]) return false;
}
return nums[4] - nums[i] <= 4;
}
int main()
{
string s;
vector<int>vs;
cin >> s;
stringstream ss(s);
string str;
while (getline(ss, str, ','))
{
vs.push_back(stoi(str));
}
printb(select(vs));
system("pause");
return 0;
}
总结
这道题本身不难,但是可以学到很多东西,。