主要内容

  1. MySQL中TRUNCATE和DELETE的区别
  2. 算法题:使用位运算来代替加减运算符

MySQL中TRUNCATE和DELETE的区别?

初次看到这个题目,说实在的非常的茫然,因为我好像从来没有用到过TRUNCATE这个关键字(PS:看来我就是一个连SQL都不会写的lz),下面是学习后的辨析,总结:

  1. 是否可以使用条件
1
2
delete from student where id=1; # 可以携带条件,删除满足条件的记录
delete from student; # 删除表中所有的数据

delete是可以是使用条件的,而truncate是不能使用条件的

1
truncate table student

而且delete和truncate都是只删除数据,会保留数据表的。

  1. 是否可以回滚
    因为delete是数据操作语言(DML),因此是可以回滚的。而truncate是数据定义语言(DDL),是无法被回滚的。

  2. 效率
    也正是因为truncate是不支持回滚的,因此需要处理事务日志,因此trucate删除数据更加快,且耗费的资源更少。

算法题:使用位运算来代替加减运算符

例题:
[leetcode371]:两整数之和 不使用运算符 + 和 - ,计算两整数 a 、b之和。

分析:
要使用位运算来代替加减运算,就需要分析一波。位运算是如何实现加法的。 0 + 0 =0 0 + 1 =1 1 + 0 =1 1 + 1 =0(进位1) 很明显的规律就是相同位为0,不同位为1.也就是异或。
那么它的进位有什么特点呢? 比如:5+4

1
2
3
4
        0101
+ 0100
——————
进位为:0100

很明显,进位就是按位与。 但是进位是应该放在高一位的,所以我们需要将进位结果左移一位。
所以我们的解放方案是:

  1. a+b的计算方案拆分为(a+b的无进位结果)+(a+b的进位结果)
  2. 循环这个操作,直到进位为0为止(可以递归)

解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int getSum(int a, int b) {
if(b==0){
//直到进位为0,就直接返回无进位结果
return a; //语句一
}
//计算进位
int out=(a&b)<<1;
//计算无进位结果
int n=a^b;
//递归调用,直到达到递归基线,也就是语句一
return getSum(n, out);

}
}