zoukankan      html  css  js  c++  java
  • 剑指offer52 构建乘积数组

     这个题的错误和c++ primier中名字的作用域例子相似。只是这里将int换成了vecto<int>这种形式。

    class Solution {
    public:
        vector<int> multiply(const vector<int>& A) {
            int length = A.size();
            vector<int> B;
            if(length <= 1)
                return B;
            else
                vector<int> B(length,1);
            for(int i = 1;i < length;i++){
                B[i] = B[i-1] * A[i-1];
            }
            int tmp = 1;
            for(int j = length-2;j >= 0;j--){
                tmp *= A[j+1];
                B[j] *= tmp;
            }
            return B;
                
        }
    };

    这个代码报“段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起”的错误。

    在else里新建了一个局部变量B,覆盖了全局变量。但两个for语句访问的B还是全局变量B,这个全局变量B是空的vector,所以会报错。

    一种解决办法是将两个for语句放进else这个块作用域中

    class Solution {
    public:
        vector<int> multiply(const vector<int>& A) {
            int length = A.size();
            vector<int> B;
            if(length <= 1)
                return B;
            else{
                vector<int> B(length,1);
                for(int i = 1;i < length;i++){
                    B[i] = B[i-1] * A[i-1];
                }
                int tmp = 1;
                for(int j = length-2;j >= 0;j--){
                    tmp *= A[j+1];
                    B[j] *= tmp;
                }
                return B;
            }    
        }
    };

    另一种改变方式是对全局变量B进行改变。需要注意的是,vector<int> B(length,1)是定义变量并初始化,相当于申请了一个新的变量,只是这个变量名和全局变量的变量名相同。B = vector<int> (length,1)不是初始化,是一个赋值语句,不要认为vector<int> B没有给具体值就没有初始化,在定义的时候都进行了初始化,只是这里的初始化为空。对于自己设想的种种

    情况以及这两种正确解法,可以把这个换成int a这种定义就方便理解了。

    class Solution {
    public:
        vector<int> multiply(const vector<int>& A) {
            int length = A.size();
            vector<int> B;
            if(length <= 1)
                return B;
            else
                B = vector<int> (length,1);
            for(int i = 1;i < length;i++){
                B[i] = B[i-1] * A[i-1];
            }
            int tmp = 1;
            for(int j = length-2;j >= 0;j--){
                tmp *= A[j+1];
                B[j] *= tmp;
            }
            return B;
                
        }
    };
  • 相关阅读:
    几款开源的图形界面库(GUI Libraries)
    CMenu菜单
    开源免费的C/C++网络库(c/c++ sockets library) 七剑下天山
    基于MFC的ActiveX控件开发
    VC++中动态生成菜单技巧
    ActiveX控件打包成Cab置于网页中自动下载安装
    VC++API小查
    全面解析MFC应用程序中处理消息的顺序
    CMenu类的使用方法
    跨域单点登录实现(使用iframe)_勇敢的心_百度空间
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/6857214.html
Copyright © 2011-2022 走看看