每天进步一点点【2019.8.23】

一、两数相除【leetcode 29】

题目描述:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商;
要求

1) 除数不为 0;
2) 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1;

输入
dividend = 10, divisor = 3
输出
3
分析

1) 如果不能使用除法、乘法和取模运算,那么就应该考虑使用加法或者位运算;【通过不断累加进行比较计算,看是否超出当前值,需要一个标记位来给出最后是否结果的正负】
2)什么时候为出现越界的情况,怎么处理?

代码:

public static  int divide(int dividend, int divisor)  {
         if(dividend==Integer.MIN_VALUE &&  divisor==-1) return Integer.MAX_VALUE;
         // 标记位
         boolean flag = true;
         if((dividend>0 && divisor<0 )||(dividend<0  && divisor>0)) flag = false;
         int sum = 0;
         int count = 0;
         while  (Math.abs(sum+divisor)<=Math.abs(dividend)) {
             sum += divisor;
             count++;
         }
         return flag?count:-count;
    }

存在问题:超出时间限制【证明单纯通过加法无法完成】

改进思路:考虑使用位运算中的移位运算来降低时间复杂度
实现

public int divide(int dividend, int divisor) {
      if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
        // 标记位
        boolean flag = (dividend^divisor)>=0;
        long dividendLong = Math.abs((long)dividend);
        long divisorLong = Math.abs((long)divisor);
        int res = 0;
        for (int i = 31; i >=0; i--) {
            if((dividendLong>>i)-divisorLong>=0){
                res += (1<

二、每日一点心理学

安慰剂效应
典故:所谓安慰剂,是指既无药效、又无毒副作用的中性物质构成的、形似药的制剂。安慰剂多由葡萄糖、淀粉等无药理作用的惰性物质构成。安慰剂对那些渴求治疗、对医务人员充分信任的病人能产生良好的积极反应,出现希望达到的药效,这种反应就称为安慰剂效应;
启发:好与人交往、有依赖性、易受暗示、自信心不足,经常注意自身的各种生理变化和不适感,有疑病倾向和神经质;

三、每日一句
A bird is safe in its nest, but that is not what its wings are made for.

你可能感兴趣的:(每天进步一点点【2019.8.23】)