C pointer

今天有个同学问到 int a[2][2]={1,2,3}, p=a+1;
(p-1)(p+1)[1] 的输出结果,当时想了好一会儿,C语言果然博大精深啊。

a 是一个二级地址,*a变成一级地址,p是一个一级指针,也就是指向变量的普通指针。如果是指向一个存地址的变量,就是二级指针了。

然后C语言 一维还是二维如果没有赋值默认都是0,今天用GCC试过了才非常确定。

p指向a[0][1], 然后p[1]等价于p+1,所以(p-1)是访问a[0][0], (p+1)[1]是相当于p+2, 也即a[1][1], 所以是10=0

如果定义int*p= a+1 则p是二级指针,指向a[1]这个一级地址

今天犯了一个低级错误,C++ “” 字符串常量是char 类型,然后string 的 + 运算符 两端至少一个string类型,因此我的char+char 就会出错

今天遇到一个三门问题,虽然之前看过,但是在此遇到,还是不会用数学公式表示。

应该枚举情况,三羊1,三羊2, 汽车。

计算转换获胜的概率:
人选择三羊1的话(P=1/3),主持人只能翻三羊2,那么转换必胜
选择三羊2的话同理P=1/3;
选择车的话,不管支持人翻哪个,转换必输。

因此P=1/3+1/3=2/3;

显然不转换获胜概率是1/3, 因此转换概率大,应当转换,虽然非常违背直觉,这里其实应该就是后验概率在作怪,缩小了样本空间后,转换和不转换
获胜的概率分布已经不平衡了。

今天遇到一个LC BigO, 帮我解决了这个组合数代码时间复杂度的问题,代码习惯前向递推,但是分析如果从后向就非常清晰了,

class Solution {
public:
    vector<vector<int> > ans;
    vector<int> cur;
    int n_, k_;
    vector<vector<int> > combine(int n, int k) {
        cur.clear(), ans.clear();
        n_=n, k_=k;
        dfs(1,0);
        return ans;
    }
    void dfs(int ni, int ki)
    {
        if(ki==k_)
        {
            ans.push_back(cur);
            return ;
        }
        if(ni>n_) return ;
        dfs(ni+1, ki);
        cur.push_back(ni);
        dfs(ni+1, ki+1);
        cur.pop_back();
    }
};

T(n,k)=T(n-1, k)+T(n-1, k-1), T(n,k)=C(n,k),经典的 组合数不等式 cool!
终于解惑了,其实不是指数级的复杂度,而是一个组合数,应该是最优的复杂度了。
LC如果别人修改了回复,不会提示,我还是偶然翻到自己的提问才发现他已经修改过了,这点需要改善一下。

Posted by richard爱闹 - 12月 31 2014
如需转载,请注明: 本文来自 Richard