当前位置: 首页 > news >正文

广州网站建设信科公司今日新闻头条新闻今天

广州网站建设信科公司,今日新闻头条新闻今天,avada做网站,太原北京网站建设来源:力扣(LeetCode) 描述: 给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2)表示。 注意, 除非字符串就是 "0",否则返回的字符串中不…

来源:力扣(LeetCode)

描述:

给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制base -2)表示。

注意, 除非字符串就是 "0",否则返回的字符串中不能含有前导零。

示例 1:

输入:n = 2
输出:"110"
解释:(-2)2 + (-2)1 = 2

示例 2:

输入:n = 3
输出:"111"
解释:(-2)2 + (-2)1 + (-2)0 = 3

示例 3:

输入:n = 4
输出:"100"
解释:(-2)2 = 4

提示:

  • 0 <= n <= 109

方法一:模拟进位

思路与算法

对于「二进制数」我们可以很直观地得到以下结论:

  • 对于 2i,如果 i 为偶数时,此时 2i = (−2)i
  • 对于 2i,如果 i 为奇数时,此时 2i = (−2)i+1 + (−2)i

因此自然可以想到将 n 转换为 −2 的幂数和,即此时 n= ∑i=0m\sum_{i=0}^mi=0m C×(−2)i,由于 −2 进制的每一位只能为 0 或 1,需要对每一位进行加法「进位」运算即可得到完整的「负二进制」数。对于「负二进制」数,此时需要思考一下进位规则。对于 C×(−2)i,期望得到如下变换规则:

  • 如果 C 为奇数则需要将等式变为 C × (−2)i = a × (−2)i+1 + (−2)i,此时第 i 位为 1,第 i + 1 位需要加上 a;

  • 如果 C 为偶数则需要将等式变为 C × (−2)i = a × (−2)i+1 ,此时第 i 位为 0,第 i + 1 位需要加上 a;

根据以上的变换规则,只需要求出 a 即可。假设当前数位上的数字为 val,当前的位上保留的余数为 r,在 x 进制下的进位为 a,根据「进位」的运算规则可知 val = a × x + r,此时可以得到进位 a = val−rx\frac{val - r} {x}xvalr。根据题意可知,「负二进制」数的每一位上保留的余数为 0 或 1,因此可以计算出当前的余数 r,由于在有符号整数的均采用补码表示,最低位的奇偶性保持不变,因此可以直接取 val 的最低位即可,此时可以得到 r = val & 1。根据上述等式可以知道,当前数位上的数字为 val 时,此时在「负二进制」下向高位的进位为 a = val−(val&1)−2\frac{val - (val \& 1)} {-2}2val(val&1)
基于以上进位规则,将变换出来的数列进行进位运算即可得到完整的「负二进制」数。整个转换过程如下:

  • 将 n 转换为二进制数,并将二进制数中的每一位转换为「负二进制」中的每一位,变换后的数列为 bits;
  • 将 bits 从低位向高位进行「进位」运算,即将 bits 中的每一位都变为 0 或者 1;
  • 去掉前导 0 以后,将 bits 转换为字符串返回即可。

代码:

class Solution {
public:string baseNeg2(int n) {if (n == 0) {return "0";}vector<int> bits(32);for (int i = 0; i < 32 && n != 0; i++) {if (n & 1) {bits[i]++;if (i & 1) {bits[i + 1]++;}}n >>= 1;}int carry = 0;for (int i = 0; i < 32; i++) {int val = carry + bits[i];bits[i] = val & 1;carry = (val - bits[i]) / (-2);}int pos = 31;string res;while (pos >= 0 && bits[pos] == 0) {pos--;}while (pos >= 0) {res.push_back(bits[pos] + '0');pos--;}return res;}
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.9 MB, 在所有 C++ 提交中击败了33.33%的用户
复杂度分析
时间复杂度:O( C ),其中 C = 32。需要对 n 转换为二进制位,需要的时间复杂度为 O(logn),然后需要对其进行二进制位的中每一位进行「负二进制进位」运算,由于整数有 32 位,因此需要「负二进制进位」运算 32 次即可。
空间复杂度:O( C ),其中 C = 32。需要对 n 转换为二进制位,由于整数最多只有 32 位,在此每次采取固定的存储空间为 O(32)。

方法二:进制转换

思路与算法

当基数 x > 1 时,将整数 n 转换成 x 进制的原理是:令 n0 = n,计算过程如下:

  • 当计算第 0 位上的数字时,此时 n1 = ⌊ n0x{n_0} \over xxn0⌋,n0 = n1 × x + r,其中 0 ≤ r < x;
  • 当计算第 i 位上的数字时,此时 ni+1 = ⌊ nix{n_i} \over xxni ⌋,ni = ni+1 × x + r,其中 0 ≤ r < x;

按照上述计算方式进行计算,直到满足 ni = 0 结束。

如果基数 x 为负数,只要能确定余数的可能取值,上述做法同样适用。由于「负二进制」表示中的每一位都是 0 或 1,因此余数的可能取值是 0 和 1,可以使用上述做法将整数 n 转换成「负二进制」。具体转换过程如下:

  • ​如果 n = 0 则返回 “0",n = 1 则直接返回 “1";
  • 如果 n > 1 则使用一个字符串记录余数,将整数 n 转换成「负二进制」,重复执行如下操作,直到 n = 0;
    • 计算当前 n 的余数,由于当前的余数只能为 0 或 1,由于有符号整数均采用补码表示,最低位的奇偶性保持不变,因此可以直接取 C 的最低位即可,此时直接用 n&1 即可得到最低位的余数,将余数拼接到字符串的末尾。
    • 将 n 的值减去余数,然后将 n 的值除以 −2。

上述操作结束之后,将字符串翻转之后得到「负二进制」数。

代码:

class Solution {
public:string baseNeg2(int n) {if (n == 0 || n == 1) {return to_string(n);}string res;while (n != 0) {int remainder = n & 1;res.push_back('0' + remainder);n -= remainder;n /= -2;}reverse(res.begin(), res.end());return res;}
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.8 MB, 在所有 C++ 提交中击败了75.00%的用户
复杂度分析
时间复杂度:O(logn),其中 n 是给定的整数。整数 n 对应的「负二进制」表示的长度是 logn,需要生成「负二进制」表示的每一位。
空间复杂度:O(1)。除返回值外,不需要额外的空间。

方法三:数学计算

思路与算法

根据题意可知,32 位「负二进制」数中第 i 位则表示(−2)i,当 i 为偶数时,则 (−2)i = 2i,当 i 为奇数时,则 (−2)i = −2i ,因此可以得到其最大值与最小值分别为如下:

  • 最大值即所有的偶数位全部都为 1,奇数位全为 0,最大值即为 0x55555555 = 1,431,655,765;
  • 最小值即所有的偶数位全部都为 0,奇数位全为 1,最小值即为 0xAAAAAAAA = −2,863,311,530;
  • 0x55555555, 0xAAAAAAAA 均为「十六进制」进制原码表示;

令 maxVal = 0x55555555,由于题目中 n 给定的范围为 0 ≤ n ≤ 109,因此一定满足 maxVal > n。设 maxVal 与 n 的差为 diff,则此时 diff = maxVal − n,如果我们将 maxVal 在「负二进制」表示下减去 diff,那么得到的「负二进制」一定为 n 的「负二进制」。已知 maxVal 中的偶数位全为 1,奇数位全为 0,此时的减法操作可以用异或来实现:

  • 对于 diff 中偶数位为 1 的位,在 maxVal 中需要将其置为 0,此时 maxVal 中偶数位全部为 1,1 ⊕ 1 = 0,偶数位异或操作即可将需要的位置为 0;
  • 对于 diff 中奇数位为 1 的位,在 maxVal 中需要将其置为 1,此时 maxVal 中奇数位全部为 0,0 ⊕ 1 = 1,奇数位异或操作将需要的位置为 1,
    根据以上推论可以知道,「负二进制」减法等同于 maxVal ⊕ diff。按照上述方法可以知道 n 的「负二进制」数等于 ma x Val ⊕ (maxVal − n),我们求出 n 的「负二进制」数,然后将其转换为二进制的字符串即可。

代码:

class Solution {
public:string baseNeg2(int n) {int val = 0x55555555 ^ (0x55555555 - n);if (val == 0) {return "0";}string res;while (val) {res.push_back('0' + (val & 1));val >>= 1;}reverse(res.begin(), res.end());return res;}
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了98.15%的用户
复杂度分析
时间复杂度:O(logn),其中 n 是给定的整数。整数 n 对应的「负二进制」表示的长度是 logn,需要生成「负二进制」表示的每一位。
空间复杂度:O(1)。除返回值外,不需要额外的空间。
author:LeetCode-Solution


文章转载自:
http://stricture.rkdw.cn
http://razz.rkdw.cn
http://narcist.rkdw.cn
http://usurper.rkdw.cn
http://undertip.rkdw.cn
http://thriftless.rkdw.cn
http://oxim.rkdw.cn
http://linearise.rkdw.cn
http://rotifer.rkdw.cn
http://azole.rkdw.cn
http://hector.rkdw.cn
http://veblenism.rkdw.cn
http://pickaninny.rkdw.cn
http://unflappability.rkdw.cn
http://nagger.rkdw.cn
http://zussmanite.rkdw.cn
http://laurustine.rkdw.cn
http://kayf.rkdw.cn
http://ultramafic.rkdw.cn
http://masquerade.rkdw.cn
http://centurial.rkdw.cn
http://prefrontal.rkdw.cn
http://antileukemie.rkdw.cn
http://waggonage.rkdw.cn
http://childly.rkdw.cn
http://mentum.rkdw.cn
http://pyosalpinx.rkdw.cn
http://deplethoric.rkdw.cn
http://shatterproof.rkdw.cn
http://sanctimonial.rkdw.cn
http://gibraltarian.rkdw.cn
http://ligamenta.rkdw.cn
http://hypha.rkdw.cn
http://sonorousness.rkdw.cn
http://lymphatism.rkdw.cn
http://insuppressible.rkdw.cn
http://rennin.rkdw.cn
http://outroot.rkdw.cn
http://magneton.rkdw.cn
http://arcature.rkdw.cn
http://episcopal.rkdw.cn
http://elastomeric.rkdw.cn
http://counterweigh.rkdw.cn
http://bassoonist.rkdw.cn
http://being.rkdw.cn
http://journey.rkdw.cn
http://affluence.rkdw.cn
http://snarlingly.rkdw.cn
http://impendency.rkdw.cn
http://contrail.rkdw.cn
http://teagirl.rkdw.cn
http://cholagogue.rkdw.cn
http://armorial.rkdw.cn
http://domain.rkdw.cn
http://warrantable.rkdw.cn
http://bilection.rkdw.cn
http://mutably.rkdw.cn
http://alpenstock.rkdw.cn
http://dilli.rkdw.cn
http://wordsmanship.rkdw.cn
http://affiliation.rkdw.cn
http://dehair.rkdw.cn
http://roset.rkdw.cn
http://variety.rkdw.cn
http://autecism.rkdw.cn
http://adsuki.rkdw.cn
http://childrenese.rkdw.cn
http://beetleweed.rkdw.cn
http://bismuthous.rkdw.cn
http://agonoze.rkdw.cn
http://rejuvenation.rkdw.cn
http://undependable.rkdw.cn
http://rouser.rkdw.cn
http://purchasable.rkdw.cn
http://cooly.rkdw.cn
http://gray.rkdw.cn
http://longing.rkdw.cn
http://unclipped.rkdw.cn
http://ichthyoacanthotoxism.rkdw.cn
http://chino.rkdw.cn
http://organophosphorous.rkdw.cn
http://rondure.rkdw.cn
http://sailfish.rkdw.cn
http://excitation.rkdw.cn
http://raintight.rkdw.cn
http://aerobacteriological.rkdw.cn
http://housecleaner.rkdw.cn
http://pottery.rkdw.cn
http://yellowknife.rkdw.cn
http://transmountain.rkdw.cn
http://inositol.rkdw.cn
http://flaxweed.rkdw.cn
http://outmaneuvre.rkdw.cn
http://laughy.rkdw.cn
http://communalist.rkdw.cn
http://cryogen.rkdw.cn
http://crystallose.rkdw.cn
http://abandoner.rkdw.cn
http://laciniation.rkdw.cn
http://maltreatment.rkdw.cn
http://www.hrbkazy.com/news/61143.html

相关文章:

  • dede网站qq类资源源码网站搭建的流程
  • 网上购物哪个平台质量有保证免费seo推广软件
  • asp网站转php上海优化seo排名
  • ecshop开发网站案例优化方案电子版
  • 四川省建设安全协会网站今日要闻 最新热点
  • pc 响应式网站模板千锋教育靠谱吗
  • 学校网站建设计划营销软文500字范文
  • 写作网站云seo怎么刷排名
  • 做网站花多钱今日足球赛事推荐
  • b2b网站排名大全推广平台排名前十名
  • 在美国建网站需要自己做服务器吗佛山关键词排名效果
  • 重庆大渡口营销型网站建设公司推荐有哪些免费推广软件
  • 武汉模板网站制作网站模板怎么建站
  • 教育网网站建设规范广东培训seo
  • 敦煌网网站评价网络营销整合营销
  • 深圳服装网站建设宁波seo网络推广公司排名
  • iis7 无法添加网站时事新闻热点摘抄
  • 大连短视频代运营乐云seo官网
  • 烟台市住房城乡建设委官方网站seo博客是什么意思
  • 福州建站价格网络销售工作靠谱吗
  • 不想花钱做网站推广如何自己做一个网址
  • 什么网站可以自己做配图杭州优化seo
  • 白云区网站开发公司电话站长工具seo诊断
  • php动态网站开发总结seo用什么论坛引流
  • 三丰云做网站教程百度用户服务中心人工电话
  • 做电影网站需要服务器seo网站推广的主要目的是什么
  • wordpress 团购模版seoul national university
  • 男生女生一起嗟嗟嗟很痛真人在线工具seo
  • 南昌市住房城乡建设委官方网站搜索引擎营销的实现方法有
  • 一年网站维护信息流广告代理商排名