最少交换次数来组合所有的 1 II(2022-3-7)七进制数(进制转化)每日一练

2134. 最少交换次数来组合所有的 1 II(2022-3-7)

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

示例 1:

输入:nums = [0,1,0,1,1,0,0]
输出:1
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[0,0,1,1,1,0,0] 交换 1 次。
[0,1,1,1,0,0,0] 交换 1 次。
[1,1,0,0,0,0,1] 交换 2 次(利用数组的环形特性)。
无法在交换 0 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 1 。

示例 2:

输入:nums = [0,1,1,1,0,0,1,1,0]
输出:2
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[1,1,1,0,0,0,0,1,1] 交换 2 次(利用数组的环形特性)。
[1,1,1,1,1,0,0,0,0] 交换 2 次。
无法在交换 0 次或 1 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 2 。

示例 3:

输入:nums = [1,1,0,0,1]
输出:0
解释:得益于数组的环形特性,所有的 1 已经聚集在一起。
因此,需要的最少交换次数为 0 。

提示:

  • 1 <= nums.length <= 10^5
  • nums[i]0 或者 1

解题思路

滑动窗口+前缀和,不能嵌套遍历,容易超时。

思路其实很简单:如果1都连起来,那么长度len是固定的,就是1的个数;

随便截取长度len的子数组,查清楚其中0的个数也就是当前的交换次数;

我们遍历数组中的每一个长度为len的子数组,维护最少的0个数,即为正确答案。

tips:

  • 关于环状数组,当右指针指向末尾时,重指向0即可;或者把nums后边再拼接一个nums
  • 关于查找0的个数,如果我们直接在子数组中遍历,是万万不行的,嵌套的循环一定会导致超时。数据长度已经达到了10^5
  • 要用「滑动窗口」的方式查找0的个数,先创建一个窗口,并查找其中0的个数计为zeros,然后开始挪动指针;每次移动去检查左端被抛弃的那个元素,和右端新加入的那个元素;检查他们是否为0,yes => 左端 => zeros减去1;yes => 右端 => zeros加上1。
  • 每次移动中,zeros的最小值即为答案
var minSwaps = function(nums) {
    let oneCount = nums.reduce((sum,v)=> sum +=v)
    let zero = 0 , left = 0, right = oneCount
    for(let i = 0; i < right; i++){ 
        zero += (nums[i]+1) & 1
    }
    let ret = zero
    while(left < nums.length){
        if(right == nums.length) right =0
        zero += ((nums[right++] ^ 1) - (nums[left++] ^ 1))
        ret = Math.min(ret,zero)
    }
    return ret
};

504. 七进制数(2022-3-7)

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1:

输入: num = 100
输出: “202”

示例 2:

输入: num = -7
输出: “-10”

提示:

  • -107 <= num <= 107

解题思路

直接API大法!toString(7)!开个小玩笑哈哈哈哈

万能模板一定要背会!

  1. 先记录负号(如果有的话)
  2. num%7就可以取得每一位上的数。比如13%7=6,(13/2)%7=1,结果就是16
  3. num / 7 | 0除7取整,相当于换下一位。

方便理解的公式:设十进制数n的七进制数为abcd
d = n m o d 7 , c = ( n / 7 ) m o d 7 , b = ( n / 7 / 7 ) m o d 7 , a = ( n / 7 / 7 / 7 ) m o d 7 d= n mod 7, c=(n/7)mod7, b=(n/7/7)mod7, a=(n/7/7/7)mod7 d=nmod7,c=(n/7)mod7,b=(n/7/7)mod7,a=(n/7/7/7)mod7

= > n = d ∗ 7 0 + c ∗ 7 1 + b ∗ 7 2 + a ∗ 7 3 => n = d * 7^0 + c * 7^1 + b * 7^2 + a * 7^3 =>n=d70+c71+b72+a73

var convertToBase7 = function(num) {
    let is = num < 0
    if(is) num = -num
    let ret = ''
    do{
        ret = num % 7 + ret
        num = num / 7 | 0
    }while(num)
    return is ? '-' + ret : ret
    // return num.toString(7)
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值