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如果别人修改了回复,不会提示,我还是偶然翻到自己的提问才发现他已经修改过了,这点需要改善一下。