Day6 不要二、把字符串转换成整数

简介: Day6 不要二、把字符串转换成整数

选择题

1. 计算机组成原理

题目:执行下面语句后的输出为()

int I=1;
if(I<=0) 
 printf("****\n");
else 
 printf("%%%%\n");


选项:

  • A. %%
  • B. ****
  • C. 有语法错,不能正确执行
  • D. %%%%

题目分析:比较考验 C 语言基础的题目,% 配合其他字符,可将其进行转义,比如 %d 表示匹配整型进行输出,如果想单纯表示 % 时,需要使用两个 % 表示一个 %,即在打印时 %% -> %

结果:A


编程题

1. 不要二

题目链接:不要二

题目分析:这也是一道纯数学题,求在 W * H 的二维矩阵中,至多可以放下多少块距离不等于 2 的蛋糕,因为是二维矩阵,所以每个格子都有相应的坐标,而两块蛋糕之间的距离的平方可以通过公式 (x1 - x2) * (x1 - x2) + (y1 -y2) * (y1 - y2) 得出


此时就比较简单了,直接创建一个 W * H 的二维数组,然后判断能否填入蛋糕(上下左右都不能有蛋糕),最后再返回成功填入的蛋糕数即可

#include <iostream>
#include <vector>
using namespace std;
bool getCake(vector<vector<int>>& vv, int x, int y)
{
    //判断
    if ((x - 2) >= 0 && vv[x - 2][y])
        return false;
    else if ((x + 2) < vv.size() && vv[x + 2][y])
        return false;
    else if ((y - 2) >= 0 && vv[x][y - 2])
        return false;
    else if ((y + 2) < vv[0].size() && vv[x][y + 2])
        return false;
    return true;
}
int main()
{
    //格中距离,不能为2
    int x = 0, y = 0;
    cin >> x >> y;
    //状态:0表示有蛋糕,1表示没蛋糕
    vector<vector<int>> vv;
    vv.resize(x, vector<int>());
    for (int i = 0; i < x; i++)
        vv[i].resize(y, 0);    //初始化状态
    int cnt = 0;    //计数
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            //填入蛋糕:距离为2的格子处没蛋糕或者越界,可正确填入
            if (getCake(vv, i, j))
            {
                vv[i][j] = 1;
                cnt++;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}



2. 把字符串转换成为整数

题目链接:把字符串转换成为整数

题目分析:这是一道来自剑指Offer的中等题,其实就是模拟库中的字符串转整数函数(atoi),题目要求比较多:给定字符串中包含很多干扰信息,比如空格、非数字字符等,所以在进行转换时需要特别注意

非法的情况:

  • 出现多个 +-
  • 在数字字符串为空时,出现了非数字字符,比如 a
  • 出现符号 +- 的情况下,仍然出现非数字字符
  • 出现前导0之后,仍然出现 +-

其他情况,诸如 出现 空格 或 其他非数字字符 时,可以将合法的字符串进行转换、出现多个符号且已存在合法字符串时,也可以进行转换

class Solution
{
public:
    int StrToInt(string s)
    {
        string numStr;
        //1、去除空格、避免非法情况、提纯
        //非法情况:
        //  同时出现 +、- (二者只能出现其一)
        //  出现符号与数字之前存在空格(非连续)
        //  未出现数字之前先出现非数字字符(不包括 +、-)
        //去除前导0:出现多个连续的前导0时,需要去除
        bool flag = false;  //正负号标志
        int symbolNum = -1;  //符号数
        for (auto e : s)
        {
            if (e != ' ')
            {
                if (e == '+' || e == '-')
                {
                    //判断是否冗余出现
                    if (e == '-') flag = true;
                    symbolNum++;
                    if (symbolNum)
                    {
                        //如果前面有合法字符串,则返回进行转换
                        if (numStr.size())
                            break;
                        return 0; //否则就是非法情况 -> 出现多个 +、-
                    }
                    if (numStr.size())
                    {
                        //此时因为符号出现在数字之后,需要去除符号的负面影响
                        //其实就是相当于数字字符串之后出现了非数字字符
                        flag = false;
                        break;
                    }
                }
                else if (!isdigit(e))
                {
                    //非数字字符的情况
                    if (numStr.size() == 0 || symbolNum == 0)
                    {
                        if (numStr.size())
                            break;
                        return 0;   //出现符号 +、- 的情况下,还出现非数字字符
                    }
                    else
                        break;  //截取有效部分进行转换
                }
                else
                {
                    //此时单纯为数字,并且为连续的数字,可以加入 numStr 中
                    //注意:前导0不参与计算
                    if (e == '0' && numStr.size() == 0)
                        symbolNum++;    //把前导0看作符号位,再出现符号就非法了
                    else
                        numStr += e;
                }
            }
            else
            {
                //需要注意非连续的情况
                //出现符号或numStr已有数据时,在出现空格则不再继续统计
                if (numStr.size() || symbolNum == 0)
                    break;  //数字字符串之后出现了非数字字符
            }
        }
        //2、进行转换
        //首先排除长度越界情况(大范围越界)
        if (numStr.size() > 10)
            return flag ? INT_MIN : INT_MAX;
        //进行转换
        int num = 0;
        int base = 0;   //用于控制当前数的大小
        auto rit = numStr.rbegin();
        while (rit != numStr.rend())
        {
            num += ((*rit - '0') * (int)pow(10, base++));
            ++rit;
        }
        flag ? num *= -1 : num;
        //3、判断越界
        //其次排除边缘越界的情况
        //本来是负数,结果转成了正数
        if (flag && num > 0)
            return INT_MIN;
        //本来是正数,结果转成了负数
        if (!flag && num < 0)
            return INT_MAX;
        return num;
    }
};


注意:需要特别注意边缘越界的情况,比如 INT_MAX + 1 是越界的



相关文章推荐


Day5 统计回文、连续最大和


Day4 计算糖果、进制转换


Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字


Day2 排序子序列、倒置字符串


Day1 组队竞赛、删除公共字符
目录
相关文章
|
存储 监控 前端开发
前端文件流、切片下载和上传:优化文件传输效率与用户体验 【最全】
文件传输是一个常见的需求。对于大文件的下载和上传,直接使用传统的方式可能会遇到性能和用户体验方面的问题。幸运的是,前端技术提供了一些高效的解决方案:文件流操作和切片下载与上传。本文将深入探讨这些技术,帮助你理解它们的原理和实现方法,以优化文件传输效率和提升用户体验。
前端文件流、切片下载和上传:优化文件传输效率与用户体验 【最全】
|
9月前
|
机器学习/深度学习 C语言 计算机视觉
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
397 12
RT-DETR改进策略【Neck】| HS-FPN:高级筛选特征融合金字塔,加强细微特征的检测
|
10月前
|
数据可视化 数据挖掘 定位技术
Pandas数据应用:地理信息系统
本文介绍如何使用Pandas结合地理信息系统(GIS)进行空间数据分析与可视化。Pandas是Python强大的数据处理库,而GIS用于捕获、存储和分析地理数据。通过安装`geopandas`、`matplotlib`等库,可以实现数据加载、转换、空间索引查询、投影变换及可视化等功能。文章详细讲解了常见问题及解决方案,并提供代码案例,帮助读者高效处理地理数据,支持决策分析。
236 26
Vue3,setup的使用需要搭配return进行使用,Vue3中带setup的script的标签和不带能不能合并到一起,export default不能放到setup里会报错,script
Vue3,setup的使用需要搭配return进行使用,Vue3中带setup的script的标签和不带能不能合并到一起,export default不能放到setup里会报错,script
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
557 2
|
人工智能 API 语音技术
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
MoneyPrinterPlus使用AI大模型技术,一键批量生成各类短视频。一键混剪短视频,批量生成短视频不是梦。自动把视频发布到抖音,快手,小红书,视频号上。
MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
|
运维 搜索推荐
新手引导
新手引导;功能旨在协助用户轻松接入AIRec服务,通过4大模块和11个子环节的step-by-step教程,实现智能推荐应用的快速搭建。它提供数据上传、策略配置、上线功能及效果评估的详细指导,并根据用户进度提出操作建议。用户可随时开启或关闭此功能。
164 1
|
传感器 人工智能
西门子S7-300模拟量模块如何接线?
模拟量输入简称模入或AI,模拟量输入模块SM331目前有三种规格型号,即8AI*12位模块、2AI*12位模块和8AI*16位模块。
西门子S7-300模拟量模块如何接线?
|
存储 Ubuntu 网络协议
【SVN内网穿透】远程访问Linux SVN服务(一)
由于文档资料越来越多,将所有资料都存放在自己的电脑上容易混淆,并且也不利于分享。这种情况下,考虑将资料上传SVN统一管理,这样一来其他人也能很方便的查略各种资料。 当SVN安装在局域网内的话,想要远程访问资料库或者代码将会受到限制,为了能从公共网络访问内网SVN资料库,cpolar能很好的解决这一需求,cpolar是一个能把内网服务暴露至公网进行访问的工具。 SVN分为服务端和客户端,服务端主要是做数据资料存储,客户端主要是图形化工具连接服务端获取服务端数据资料,下面介绍在ubuntu系统安装服务端,在通过客户端远程访问。
396 0