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)。该函数就是用一个全局变量来标志输入是否合法的。

    
    
    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    网站、博客、文章推荐
    hdu 4000 Fruit Ninja
    2011年 北京区域赛A题 Qin Shi Huang's National Road System // hdu 4081 Qin Shi Huang's National Road System 最优比率生成树
    2008 北京区域赛 Minimal Ratio Tree
    uva 10608 Friends 并查集
    2011 北京区域赛 Hou Yi's secret // hdu 4082
    C/C++中有关字长与平台无关的整数类型(转)
    C/C++中有关字长与平台无关的整数类型(转)
    C# Windows Media Player 控件使用实例 方法(转)
    c# 系统时间
  • 原文地址:https://www.cnblogs.com/hello-yz/p/3185174.html
Copyright © 2011-2022 走看看