zoukankan      html  css  js  c++  java
  • 剑指offer-17题

    题目要求:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345

    分析:这道题能够很好地反应出程序员的思维和编程习惯。

    的确,自己编写的程序代码如下:

    #include "stdafx.h"
    #include<iostream>
    
    void String2Num(const char* str);
    using namespace std;
    int main(int argc, char* argv[])
    {
    	const char* str = "2343121";
    	String2Num(str);
    	return 0;
    }
    
    void String2Num(const char* str)
    {
    	long value = 0;
    	while(*str != '')
    	{
    		value = value*10 + (*str - '0');
    		str++;
    	}
    	cout<<value<<endl;
    }
    

      很多地方都没有考虑到,优秀程序员应该考虑到以下几方面:

    1、主体:

    value = value*10 + (*str - '0');
    

    2、因为用到指针,所以判空

    if(str != NULL)
    

    3、数据溢出

    4、对输入非法数据的处理

    所以标准答案很不错,Nice!如下:

    enum Status {kValid = 0, kInvalid};
    int g_nStatus = kValid;
    
    ///////////////////////////////////////////////////////////////////////
    // Convert a string into an integer
    ///////////////////////////////////////////////////////////////////////
    int StrToInt(const char* str)
    {
          g_nStatus = kInvalid;
          long long num = 0;
    
          if(str != NULL)
          {
                const char* digit = str;
    
                // the first char in the string maybe '+' or '-'
                bool minus = false;
                if(*digit == '+')
                      digit ++;
                else if(*digit == '-')
                {
                      digit ++;
                      minus = true;
                }
    
                // the remaining chars in the string
                while(*digit != '')
                {
                      if(*digit >= '0' && *digit <= '9')
                      {
                            num = num * 10 + (*digit - '0');
    
                            // overflow  
                            if(num > std::numeric_limits<int>::max())
                            {
                                  num = 0;
                                  break;
                            }
    
                            digit ++;
                      }
                      // if the char is not a digit, invalid input
                      else
                      {
                            num = 0;
                            break;
                      }
                }
    
                if(*digit == '')
                {
                      g_nStatus = kValid;
                      if(minus)
                            num = 0 - num;
                }
          }
    
          return static_cast<int>(num);
    }
    

    另外的解释:

    讨论:在参考代码中,我选用的是第一种声明方式。不过在面试时,我们可以选用任意一种声明方式进行实现。但当面试官问我们选择的理由时,我们要对两者的优缺点进行评价。第一种声明方式对用户而言非常直观,但使用了全局变量,不够优雅;而第二种思路是用返回值来表明输入是否合法,在很多API中都用这种方法,但该方法声明的函数使用起来不够直观。

    最后值得一提的是,C语言提供的库函数中,函数atoi能够把字符串转换整数。它的声明是int atoi(const char*str)。该函数就是用一个全局变量来标志输入是否合法的。

    
    
    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    用Jdbc连接数据库后实现增删改查功能
    jdbc连接数据库
    聚合函数和分组查询
    数据库MySQL
    commons工具类 FilenameUtils FileUtils
    打印流(PrintWriter )
    一次性认识终端命令
    JSON数据展示神器:react-json-view(常用于后台网站)
    table固定列的宽度,超出部分用…代替(针对普通table和antd)
    git项目,VSCode显示不同颜色块的含义
  • 原文地址:https://www.cnblogs.com/hello-yz/p/3185174.html
Copyright © 2011-2022 走看看