剑指OfferDay1 -- 大二下

剑指 Offer II 001. 整数除法

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。

注意:

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1
示例 1:

输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7
示例 2:

输入:a = 7, b = -3
输出:-2
解释:7/-3 = truncate(-2.33333…) = -2
示例 3:

输入:a = 0, b = 1
输出:0
示例 4:

输入:a = 1, b = 1
输出:1

提示:

-231 <= a, b <= 231 - 1
b != 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/xoh6Oh
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

var divide = function(a, b) {
  let max = Math.pow(2, 31) - 1;
  let min = Math.pow(-2, 31);
  let flag = 0;
  if (a<0&&b>0 || a>0&&b<0) {
    flag = 1;
  }
  if (a == min && b ==-1) {
    return max;
  }
  a = Math.abs(a);
  b = Math.abs(b);
  let count = 0;
  while(a>=b){
    a -= b;
    count++;
  }
  return flag?-count:count;
};

利用循环减法来实现除法的循环,但是涉及边界的时候会超时,所以只能把这种情况单独列出来处理一下,这样就能顺利通过了。
flag是用于判断最后的返回值正负的

剑指 Offer II 002. 二进制加法

给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。

输入为 非空 字符串且只包含数字 1 和 0。

示例 1:

输入: a = “11”, b = “10”
输出: “101”
示例 2:

输入: a = “1010”, b = “1011”
输出: “10101”

提示:

每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/JFETK5
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

var addBinary = function(a, b) {
  let x = parseInt(a, 2);
  let y = parseInt(b, 2);
  let res = x + y;
  return res.toString(2);
};

利用内置显式转换来实现这个题目,由于js内置方法精度越界原因导致力扣无法通过。(有时间可以想办法解决一下)
但基础思路没问题,先利用显示转换把输入的二进制数转成十进制的数,然后进行运算最后将得到的结果转换成二进制字符串返回。
parseInt是将数字最后转换成十进制
toString则是将数字转换成想要的进制的字符串

var addBinary = function(a, b) {
  let len = Math.max(a.length, b.length);
  let flag = 0;
  let res = '';
  let i = len - 1;
  a = a.padStart(len, '0');
  b = b.padStart(len, '0');// 为了保证传入的两个字符串长度一致为最大长度
  while (i>=0) {
    flag = Number(a[i]) + Number(b[i]) + flag;// flag为是否进位的一种表示
    res = flag%2 + res;// 字符串拼接
    flag = Math.floor(flag/2);// 小数向下取整
    i --;
  }
  if (flag == 1) {
    res = '1' + res;// 判断最后要不要进一
  }
  return res;
};

这个是看题解学到的,直接按照平时计算二进制加法的时候人类的思维按位进行加法运算

剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。

示例 1:

输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:

输入: n = 5
输出: [0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/w3tCBm
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

var countBits = function(n) {
  let res = [];
  for(let i = 0; i <= n; i++){
    let count = 0;
    let temp = i.toString(2);
    for(let j = 0; j < temp.length; j++){
      if (temp[j] == 1) {
        count ++;
      }
    }
    res.push(count);
  }
  return res;
};

利用js暴力解题,就是时间复杂度有点高

var countBits = function(n) {
    let res = [];
    for(let i = 0; i <= n; i++){
    let temp = i.toString(2);
    let arr = temp.split("");
    res.push(arr.filter(x => x == 1).length);
    }
    return res;
};

用js自带的函数实现一下内部的循环,当然只是看起来少了一点,实际上时间复杂度还是高的。

padStart(),padEnd()方法

es6新增的方法,字符串补全长度

例:

let x = 'xxx';
x.padStart(5, 'y'); // 'yyxxx'
x.padStart(5, 'abc'); // 'abxxx'
x.padStart(5); //'  xxx'

第一个参数是定义字符串的长度,如果字符串的长度大于补全的字符,那就让补全的字符重复,如果小于补全的字符,那就会截去补全的超出去的部分
如果没有第二个参数,会用空格补全字符串
如果长度小于原本字符串的长度,那就返回原字符串

padEnd()是从后补齐,和padStart()正好相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值