剑指offer--面试题11

摘要:
“);elsereturn0;}doublebase_exponent=1;ifreturn1;elseif{whilebase_exporent*=base;return1.0/base_exponent;}elseif{whilease_exporent*=base,returnbase_expression;}}不熟悉try-and-catch应用程序,只知道catch(…)会捕获所有可能的异常。以下是作者的代码:#include”stdafx“。h“#includeboolg_InvalidInput=false;boolequal;doublePowerWithUnsignedExponent;doublePower{//g_InvalidInput=false;if{g_InvalidInput=true;return0.0;}unsignedtabsExponent=;ifabsExponent=;doubleresult=PowerWithUnSignedExponet;ifresult=1.0/result;returnresult;}/*doublePowerwithUnsignedIndex{doubleresult=1.0;/foreresult*=base;returnresult;}*doublePower WithUnsigned Exponent{ifreturn1;ifreturnbase;doubleresult=PowerWithUnsignedExponent;result*=result;ifresult*=base;returnresult;}boolequal{ifreturntrue;elsereturnfalse;}通过这个面试问题,您真正意识到在编程时必须考虑问题的全面性!!!包括各种负面测试、输入测试和涉及的各种情况。转换为代码:v1-v2˃-0.0000001&&v1-v2˃1;3.实现2(%2)操作剩余部分的更有效方法:intersult;在代码中,它是result&0x1==1。若为真,则结果为奇数。

题目:求数值的整数次方,不考虑大数值情况

  即实现函数:double Power(double base, int exponent)

自己所写代码如下:

#include "stdafx.h"
#include <iostream>

double Power(double base, int exponent);

int main(int argc, char* argv[])
{
    double base = -1;
    int exponent = 0;
    try
    {
        std::cout<<Power(base,exponent)<<std::endl;
    }
    catch(...)
    {
        std::cout<<"Invalid parameters!"<<std::endl;
    }
    return 0;
}

double Power(double base, int exponent)
{
    if(base == 0)
    {
        if(exponent <= 0)
            throw new std::exception("Invalid parameters!");
        else
            return 0;
    }
    double base_exponent = 1;
    if(exponent == 0)
        return 1;
    else if(exponent < 0)
    {
        while(exponent++)
            base_exponent *= base;

        return 1.0/base_exponent;
    }
    else
    {
        while(exponent--)
            base_exponent *= base;

        return base_exponent;
    }
}

对try,catch应用还不熟练,只知道catch(...)会抓取所有可能异常。

看过作者的代码后,真心感觉自己的代码‘矬的一比’!

以下为作者代码:

#include "stdafx.h"
#include <math.h>

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);
 
double Power(double base, int exponent)
{
    //g_InvalidInput = false;
 
    if(equal(base, 0.0) && exponent < 0)
    {
        g_InvalidInput = true;
        return 0.0;
    }
 
    unsigned int absExponent = (unsigned int)(exponent);
    if(exponent < 0)
        absExponent = (unsigned int)(-exponent);
 
    double result = PowerWithUnsignedExponent(base, absExponent);
    if(exponent < 0)
        result = 1.0 / result;
 
    return result;
}
 
/*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    double result = 1.0;
    /
    for(int i = 1; i <= exponent; ++i)
        result *= base;
 
    return result;
}
*/
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;

    double result = PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;
    if((exponent & 0x1) == 1)
        result *= base;

    return result;
}

bool equal(double num1, double num2)
{
    if((num1 - num2 > -0.0000001)
        && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}

通过该面试题,自己真正体会到在编程时,务必做到考虑问题的全面性!!!包括各种负面测试,输入测试以及本身涉及到的各种情况。

自己所写代码中,之前也丢掉了对0的负次幂的处理。。。

参考代码采用的是:设置全局变量的错误处理方式,出错时将设置g_InvalidInput 为true;自己所写代码则是使用C++中的异常处理方法:throw std::new exception("Invalid parameters!")

另外,学习该代码更重要的是学到了3个编程技巧

1、千万注意的:判断两个小数是否相等,不能直接使用==。例如double和float类型。

  所采用的方法:如参考代码中那样,设计一个函数equal。判断相等的原则是:小数v1和v2的差值的绝对值|v1-v2|在很小的范围内,比如0.0000001。

  转换为代码:v1-v2 > -0.0000001 && v1-v2 < 0.0000001。

剑指offer--面试题11第1张

bool equal(double num1, double num2)
{
    if((num1 - num2 > -0.0000001)
        && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}

2、实现除2操作(/2)的更高效做法:int result = exponent >> 1;  (exponent >> 1)

3、实现对2取余(%2)操作的更高效方法(实际上是判断数值为奇数偶数):int result; (result%2)  <==>  (result & 0x1)

                                 代码中为result & 0x1 == 1,此时若成立则result为奇数。

免责声明:文章转载自《剑指offer--面试题11》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 基本理论知识点前后端分离结构中使用shiro进行权限控制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

weblogic 的应用链接不上数据库报异常 Caused By: weblogic.common.ResourceException: Io exception: Connection reset 错误信息表示访问数据库异常,创建链接池失败

weblogic对此值注释:尝试建立数据库连接的间隔秒数。如果已设置此值且在创建数据源时数据库不可用,则在您指定的秒数之后,WebLogicServer将重新尝试在池中创建连接,并会不断尝试创建连接,直到创建成功。如果设置为0,则将禁用连接重试。...

mac下vscode插件位置

1、 位置:Mac:User/(您的用户名)/vscode/extensions II下vscode插件的存储位置。搜索步骤:以我的mac为例,打开查找器,单击远程CD,单击转到上面的文件夹,单击macintosh HD,单击用户(或用户),单击mymac,单击。vscode(.vscode是一个隐藏文件。如果默认情况下不显示,请按住ctrl+shift+....

如何在Android模拟器上安装apk文件

如本实例的“mishop_2.0.20130911_1.1.1.apk”3.执行控制台命令,进行安装。切换到D盘,输入D:,然后点击Enter,即切换到D盘,输入cd,找到platform-tools的文件地址,即adb.exe的文件路径。,粘贴在控制台中。...

log4j2

4.日志级别:我们现在将调用logger方法。然而,这个logger对象中有很多方法,所以我们应该首先了解log4j的日志级别,它指定了几个默认级别:trace˂debug˂info˂warn˂error˂false等。电话很简单。log4j的核心在配置文件中。如果我已经定义了日志,我将日志级别更改为TRACE,输出将如下:19:11:36.941TRACE...

Chrome 浏览器快捷键

谷歌Chrome可以记住最近关闭的10个标签。Shift+Alt+T将焦点设置在浏览器工具栏中的第一个工具上。按空格键或Enter键激活工具栏按钮,包括网页操作和浏览器操作。Ctrl+Shift+Delete将打开“清除浏览数据”对话框。同时按下Ctrl键和左箭头键。主页转到页面顶部。Ctrl+X或Shift+Delete将删除高亮显示的内容并将其复制到剪贴...

VSCode 中Python代码自动补全与智能提示【转】

如何在VSCode中设置python环境的自动完成和智能提示?)如果在完成上述两个安装步骤后仍然没有自动完成和智能提示,您可以如下解决问题:打开VSCode设置打开json有很多方法。只有两种方法:1)使用快捷键组合并选择图中标记为红色的选项。2)在VSCode的“设置”部分中,搜索autoComplete和Editinsettings。json。打开它。...