字符串相乘
43 字符串相乘
两数A位和B位,相加后位数最大为max(A, B)+1;相乘后最大位数为A+B
1.1 常规法
将两个串的指针位置m和n、进位c统一放入while循环,代码就会很优美。 代码可以继续优化速度存储:addtion函数改为原地相加,但是会破坏代码的逻辑性,就不改了。
1 | class Solution { |
两数A位和B位,相加后位数最大为max(A, B)+1;相乘后最大位数为A+B
将两个串的指针位置m和n、进位c统一放入while循环,代码就会很优美。 代码可以继续优化速度存储:addtion函数改为原地相加,但是会破坏代码的逻辑性,就不改了。
1 | class Solution { |
1 | class Solution { |
1 | class Solution { |
在解LC-470前先介绍一道拒绝采样的经典问题:利用频率近似概率的方式求出 $\pi$ 的值。在 $1\times1$ 的方块内随机坐标采样,记录落入以原点为圆心,半径为1的 $\frac{1}{4}$ 圆内的次数。
由 $\frac{1}{4}\pi r^2 = \frac{cnt}{N}$ 可得 $\pi = \frac{4\times cnt}{N\times r^2}$ ,由于 $r=1$ ,所以 $\pi = \frac{4\times cnt}{N}$
1 | int main() { |
无法解决诸如(())的问题。 要考虑到当前碰到右括号后,前面的是左括号还是右括号,然后分别进行处理
1 | class Solution { |
目标检测SSD
s指的是长宽的缩放比例而非面积的缩放比例,比如s=0.5,则面积就是原图像的0.5^2=0.25倍。r是宽高比,指的是将原图像归一化为正方形后截取的锚框的宽高比;或者说是在原图像的宽高比基础上乘以r,才是锚框的宽高比。锚框的实际宽高比即$\frac{w}{h}r$。之所以r=1时你看到的是方形,之后会解释。
由此,可得以下方程组
$$\begin{cases}
w_0h_0=s^2wh\
\frac{w_0}{h_0}=\frac{w}{h} * r
\end{cases}$$
解得
$$
\begin{cases}
w_0=sw\sqrt{r}\
h_0=sh/\sqrt{r}
\end{cases}
$$
$w_0和h_0$分别处以w和h进行归一化,可得
$$
\begin{cases}
w_0=s\sqrt{r} \
h_0=s/\sqrt{r}
\end{cases}
$$
而在代码中我们可以看到:
1 | w0 = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]), |
C++ priority_queue自定义排序总结
以下几种都可以,具体可参考《C++ Primer》
1 | typedef int elem; |
对于cmp和&cmp你应该这样理解,cmp是函数的首地址,它的类型是bool(elem, elem),&cmp表示一个指向函数cmp这个对象的地址,它的类型是bool(*)(elem, elem),因此test和&test所代表的地址的值是一样的,但类型不一样!
s的类型是二维数组,但是其本身也是一个一维指针(数组指针),其静态类型是char(*)[10],每次移动是10个char长度也就是10字节。其解引用后静态类型是char*,每次移动是1个char长度也就是1字节。
值得注意的是,类似函数指针,s、*s、&s其值都是一样的,都是该二维数组首个元素的地址,因此不能将数组名当成是一个值为元素首地址的常规变量!因为永远无法取得其地址。
因此,下面代码中将s赋值给双重指针ps是完全错误的;双重指针要经过两次间接跳转访问元素:比如ps的值为0x0000ff33,*ps首先跳转到该位置后取其值,比如说那个地址的值为0x0000eedd,将*ps当成字符串输出时,会再次跳转到地址为0x0000eedd的位置取出char,完全乱了。
而作为对比,数组指针解引用不会跳转,只会修改其步幅跨度
经典读者写者问题
1 | int readcount=0; |