判断读入的字符串是否为顺子,字符如果出现0,则可以替换1-9中的任意数字。(笔试题)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

读入一个字符串,字符串以逗号分割,字符串有且仅有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;
}

总结

这道题本身不难,但是可以学到很多东西,。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用C语言字符串相关函进行替换,具体方法如下: 1. 使用strstr()函查找字符串S1是否存在要替换字符串S2,如果存在,则返回S2在S1第一次出现的位置指针;如果不存在,则返回NULL。 2. 如果找到了要替换字符串S2,则可以使用strcpy()函将S1该位置及之后的部分复制到一个临时字符串temp,然后使用strcat()函将temp和替换字符串S3连接起来,最后使用strcat()函将S1该位置之前的部分和新的字符串连接起来即可。 3. 如果S2存在多次出现,则可以使用循环不断进行替换,直到所有的S2都被替换为止。 参考代码如下: ```c #include <stdio.h> #include <string.h> void replace(char *s1, char *s2, char *s3) { char *pos, temp[1000]; int len1, len2, len3, offset; len1 = strlen(s1); len2 = strlen(s2); len3 = strlen(s3); pos = strstr(s1, s2); while (pos != NULL) { offset = pos - s1; // 计算S2在S1的位置偏移量 temp[0] = '\0'; // 临时字符串清空 strcat(temp, pos + len2); // 复制S2后的部分 strcat(temp, s3); // 将替换字符串加入 strcat(s1, temp + offset); // 将原始字符串的剩余部分拼接起来 strncpy(pos, s3, len3); // 替换原始字符串的该部分 pos = strstr(s1 + offset + len3, s2); // 继续查找下一个 } } int main() { char s1[1000], s2[1000], s3[1000]; printf("请输入字符串S1:"); fgets(s1, sizeof(s1), stdin); s1[strlen(s1) - 1] = '\0'; // 将fgets()函读入的换行符去掉 printf("请输入要替换字符串S2:"); fgets(s2, sizeof(s2), stdin); s2[strlen(s2) - 1] = '\0'; printf("请输入替换后的字符串S3:"); fgets(s3, sizeof(s3), stdin); s3[strlen(s3) - 1] = '\0'; replace(s1, s2, s3); printf("替换后的字符串为:%s\n", s1); return 0; } ``` 注:此代码仅供参考,可能存在一些细节问题,如需使用请自行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值