每日一道leetcode:8. 字符串转换整数 (atoi)

每日一道leetcode:8. 字符串转换整数 (atoi)

1. 题目(中等)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格

检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。

返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ’ ’ 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = “42”
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:“42”(当前没有读入字符,因为没有前导空格)
第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
第 3 步:“42”(读入 “42”)
解析得到整数 42 。
由于 “42” 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
第 2 步:" -42"(读入 ‘-’ 字符,所以结果应该是负数)
第 3 步:" -42"(读入 “42”)
解析得到整数 -42 。
由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = “4193 with words”
输出:4193
解释:
第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格)
第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止)
解析得到整数 4193 。
由于 “4193” 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-’ 和 ‘.’ 组成

2. 分析与解答

思路:字符串解析。分情况:

  • 去除字符串开始的空格
  • 判断正负号
  • 逐个判断是否为数字并将其转换成数字,注意判断是否越界
注意:中间遇到空格也是要退出的情形

代码:

class Solution {
public:
    int myAtoi(string s) {
        int n = s.length();
        int res = 0;
        int index = 0;
        // 去除前置空格
        while (index < n) {
            if (s[index] == ' ') index++;
            else break;
        }
        // 从第一个非空格开始,判断是否是负数
        int p = 1;
        if (s[index] == '-') {
            p = -1;
            index ++;
        } else if (s[index] == '+') {
            index ++;
        }
        for (int i = index; i < n; i++) {
            if (isdigit(s[i])) {
                int add = s[i]-'0';
                if (res > (INT_MAX - add) / 10) {
                    return p == 1 ? INT_MAX : INT_MIN;
                } else {
                    res = res * 10 + add;
                }
            } else break;
        }
        return res * p;
    }
};

Read more

普通程序员,如何转型大数据相关方向?

普通程序员,如何转型大数据相关方向?

最近,身边几个程序员朋友都在自学Spark、Hadoop等相关知识,仿佛不紧跟时代步伐,就会被随时甩出半条街的节奏;而打开知乎,诸如“怎样进行大数据的入门学习”“Java Web 程序员如何转型大数据”之类的话题也屡受关注。 大数据之爱绝非偶然 1、技术日渐成熟,应用空间得以拓展 大数据技术,最早于1980年被首次提及,却在近几年才获得突飞猛进的发展。相较于几十年前神经网络算法捉襟见肘的计算能力,如今处理器对大规模数据的高速处理能力无疑发挥了关键性的作用。借助于处理器的高性能,使我们短时间内完成PB 级数据的机器学习和模型训练成为可能,由此为高度依赖深度学习的图像、语音识别产品的快速迭代奠定基础,大数据应用空间得以拓展,也由此催生了提供相关产品与服务的技术公司。 2、重视数据资产,数据挖掘已成必然 现代信息技术使每日产生的数据量呈指数级增长,企业发展再也无法回避对数据价值的挖掘与利用。电商平台利用画像做个性化推荐,互联网金融公司利用高危识别技术管控金融风险,滴滴出行利用交易数据通过实时定价优化利润……这些都是对大数据价值的发掘和利用。随着数据资产意识的加强,数据挖掘也将获得越

By Ne0inhk
项目管理学习总结(3)——产品文档的规划化管理总结

项目管理学习总结(3)——产品文档的规划化管理总结

一、本地文档如何管理 项目通过文件夹管理 经受过的项目比较多,我按照“开始月份~结束月份+项目名称”的方式来命名,方便后续回顾。 按照职能设子目录 比如我们是PM,那主要资料应该是需求文档,其次经常被传达的可能是用户需求、可能需要了解学习的技术资料、每个人都需要了解的公司资料。 产品文档按照平台不同设子目录 这一步可能不是必须的,比如前端PM就可能跳过这一步。 产品文档按照版本号设子目录 文件夹命名格式为“版本号+核心模块名称”,比如客户端的详情如下。 每个版本使用迭代记录 记录该版本的所有内容,首先是PRD、其次是视觉稿、交互稿、以及相关技术资料。 我的产出物是PRD,是用Axure画出原型,然后带交互和逻辑,含流程图。源文件就是rp文件,如上所述。 需要注意的是,对于涉及到前后端的版本,我一般放在客户端文件夹中。 分支版本请命名规范 有时候一个大版本除了主线版本之外,还有分支版本,此时我会单独起一个新rp文件。 分支版本往往是某个模块,命名规则为“版本号+模块名称+期数”,这样命名的好处是可以搜索出该功能的所有版本,方便回顾复盘。

By Ne0inhk
Oracle学习总结(3)——Navicat客户端连接Oracle数据库常见问题汇总

Oracle学习总结(3)——Navicat客户端连接Oracle数据库常见问题汇总

问题1:ORA-28547:connection to server failed,probable Oracle Net admin error 问题描述: 服务器连接失败 解决方案: 百度了一下,原来是oci.dll版本不对,Navicat是通过Oracle客户端连接Oracle服务器的。我们用Navicat时通常会在自己的安装路径下包含多个版本的OCI,如果出现ORA-28547错误,多是因为Navicat本地的OCI版本与Oracle服务器不符合,需要先下载一个跟Oracle版本一致的OCI。 文件下载地址:http://pan.baidu.com/s/1eSyhVRO(这里需要注意的是不管你Oracle版本是32的还是64的,都需要下载32bits的) 我的Oracle是11.2的,需要下载instantclient_11_2与之对应。 下载完成之后需要修改一下Navicat里面的OCI地址链接,操作如下: 然后重新启动一下Navicat就OK啦。  问题2:无法打开Oracle Net  Configuration assistant 错误描述

By Ne0inhk
项目管理学习总结(2)——需求收集和管理

项目管理学习总结(2)——需求收集和管理

需求收集对于产品经理来说,都已经属于老生常谈了。在产品的立项和设计前需要先做需求调研,在这里我们就来谈谈如何进行需求收集和管理。 一、需求收集目的 需求收集的目的就是了解用户目前所需要的是什么,最迫切需要去解决的问题是什么,有哪些是我们目前所没有满足的等等。通过以市场为导向的客户需求收集,保持产品的核心竞争力,最终实现产品创新。 1.深刻理解市场需求、用户需求、准确把控行业发展趋势,保持高度的市场敏感度; 2.保证产品研发是围绕客户需求来展开,真正实现产品研发“以市场为导向,以客户为中心”,而不是闭门造车; 3.实现产品创新。通过有创新性的新卖点、新产品的持续不断推出,保证公司产品核心的竞争优势; 4.及时获得竞争对手相关产品及市场策略,做到“知己知彼”; 5.通过需求收集等相关活动,有机地串接市场营销部门与产品研发部门、建立跨职能部门、端到端的流程进行需求开发; 6.加强与用户互动,提升用户忠诚度和粘性。 二、需求收集原则 原则上所有需求都是围绕产品展开,所以应以公司的产品愿景和产品战略为指导:针对产品目标用户群体,不同需求进行优先级划分,以为用户提供实用价值

By Ne0inhk