数字与数学高频问题(算法村第十三关白银挑战)

数组实现加法专题

数组实现整数加法

66. 加一 - 力扣(LeetCode)

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9
解一
public int[] plusOne(int[] digits)
{for (int i = digits.length - 1; i >= 0 ; i--){//若某一位加一后不会产生进位,则该位加一后直接返回if(digits[i] != 9){digits[i]++;return digits;}//发生进位,低位归零digits[i] = 0;}//进位发生在最高位:99999999int[] ans = new int[digits.length + 1];ans[0] = 1;return ans;
}
解二
public int[] plusOne(int[] digits)
{for (int i = digits.length - 1; i >= 0 ; i--){digits[i]++;//计算低位digits[i] = digits[i] % 10;//加一后不出现进位,直接返回if(digits[i] != 0)return digits;}//进位发生在最高位:99999999int[] ans = new int[digits.length + 1];ans[0] = 1;return ans;
}

字符串相加

415. 字符串相加 - 力扣(LeetCode)

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

  • 1 <= num1.length, num2.length <= 104
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零
StringBuilder + 位数不同就补零
public String addStrings(String num1, String num2)
{int i = num1.length() - 1;int j = num2.length() - 1;int carry = 0;  //进位StringBuilder ans = new StringBuilder();while (i >= 0 || j >= 0 || carry == 1){int x = i >= 0 ? num1.charAt(i) - '0' : 0;int y = j >= 0 ? num2.charAt(j) - '0' : 0;int curSum = x + y + carry;ans.append(curSum % 10);    //先把低位相加的结果放在前面carry = curSum / 10;i--;j--;}//反转:高位在前,低位在后。然后StringBuilder类型转为字符串类型再返回return ans.reverse().toString();
}

二进制求和

67. 二进制求和 - 力扣(LeetCode)

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 104
  • ab 仅由字符 '0''1' 组成
  • 字符串如果不是 "0" ,就不含前导零

把求余和整除换成2即可

public String addBinary(String a, String b)
{int i = a.length() - 1;int j = b.length() - 1;int carry = 0;  //进位StringBuilder ans = new StringBuilder();while (i >= 0 || j >= 0 || carry == 1){int x = i >= 0 ? a.charAt(i) - '0' : 0;int y = j >= 0 ? b.charAt(j) - '0' : 0;int curSum = x + y + carry;ans.append(curSum % 2);    //先把低位相加的结果放在前面carry = curSum / 2;i--;j--;}//反转:高位在前,低位在后。然后StringBuilder类型转为字符串类型再返回return ans.reverse().toString();
}

幂运算

2 的幂

231. 2 的幂 - 力扣(LeetCode)

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方

提示:

  • -2^31 <= n <= 2^31 - 1

**进阶:**你能够不使用循环/递归解决此问题吗?

循环一
public boolean isPowerOfTwo(int n)
{//负数和0不可能是2的幂次方if (n <= 0)return false;for (int i = 0; Math.pow(2, i) < Integer.MAX_VALUE; i++){if(n == Math.pow(2, i))return true;}return false;
}
循环二

2的幂次方的特点:整除2后是偶数,不断整除2的结果是1

这个方法比循环一要高效

public boolean isPowerOfTwo_3(int n)
{if (n <= 0)return false;while (n % 2 == 0)n = n / 2;return n == 1;
}
位运算

正整数 n 是 2 的幂,当且仅当 n 的二进制表示中只有最高位是 1,其余位都是 0

public boolean isPowerOfTwo(int n)
{//n & (n - 1)的作用是消除 n 的二进制表示中最低位的1//如果 n 是2的幂次方,那 n 的二进制表示中只有最高位为1//除去1后,结果应该为零,否则就不是2的幂次方return n > 0 && ((n & (n - 1)) == 0);
}

3 的幂

326. 3 的幂 - 力扣(LeetCode)

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false

整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x

循环
public boolean isPowerOfThree(int n)
{if (n <= 0)return false;while (n % 3 == 0)n = n / 3;return n == 1;
}
一步到位

如果n是3的幂次方,则整型范围内n一定是最大的3的幂次方的除数

public boolean isPowerOfThree(int n)
{// 1162261467 is the largest power of 3return (n > 0) && (1162261467 % n == 0);
}

4的幂

342. 4的幂 - 力扣(LeetCode)

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

循环
public boolean isPowerOfThree(int n)
{if (n <= 0)return false;while (n % 4 == 0)n = n / 4;return n == 1;
}
位运算

在这里插入图片描述

同余符号 ≡:在数论中使用,表示两个整数除以同一个数后余数相等。例如,a ≡ b (mod m)表示ab除以m后有相同的余数。

由于

4 ≡ 1 ( mod 3)

4^2 ≡ 1^2 ≡ 1 ( mod 3)

4^3 ≡ 1^3 ≡ 1 ( mod 3)

以此类推,可以得出对于任何整数4^x ≡ 1 ( mod 3)

public boolean isPowerOfFour(int n)
{//若n是4的幂次方,则n一定是2的幂次方return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
}

更多题目

50. Pow(x, n) - 力扣(LeetCode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437988.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试人员常用的功能测试方法分享

功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。 常用的测试方法如下&#xff1a; 1. 页面链接检查 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正确。 2. 相关性检查 删除/…

[k8s系列]:kubernetes·概念入门

文章目录 序言1 kubernetes概述1.1 kubernetes解决的问题1.1.1 部署方式的演变1.1.2 容器化部署——容器编排问题 1.2 kubernetes组件1.2.1 kubernetes组件调用关系1.2.2 调用逻辑示例 序言 序言&#xff1a;本文将从&#xff0c;第一节&#xff1a;kubernetes解决的问题、组件…

【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手

目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 ​编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…

【hcie-cloud】【23】容器编排【k8s】【Kubernetes常用工作负载、Kubernetes调度器简介、Helm简介、缩略词】【下】

文章目录 单机容器面临的问题、Kubernetes介绍与安装、Kubernetes对象的基本操作、Kubernetes YAML文件编写基础Kubernetes常用工作负载Kubernetes常用工作负载简介创建一个无状态nginx集群无状态工作负载Deployment说明无状态工作负载Deployment常见操作创建一个有状态的MySQL…

MySQL解决 恢复从备份点到灾难点之间数据恢复

CSDN 成就一亿技术人&#xff01; 今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢&#xff1f; 数据库数据高于一切&#xff08;任何数据是不能丢失的&#xff09; CSDN 成就一亿技术人&#xff01; 目录 1.准备测试数据库 2.备份数据库 观…

D6287F——正反转马达驱动电路,采 用 SOP8的 封 装 形 式 封 装 。驱动电流最高可达1.0A

D6287F 是 一 块 正 反 转 马 达 驱 动 电 路 &#xff0c;两 种 逻 辑 输 入 方 式 可 控 制 马 达 的 正 转 、 反 转 、 停 止 、 中 断 等 。 内 置 马 达 停 止 时 省 电 电 路 及 热 保 护 电 路 。 最 大 驱 动 电 流 达 1.0A 。 广 泛 用 于 VCRs及 音 频 设 备 等 电…

QEMU源码全解析42 —— Machine(12)

接前一篇文章&#xff1a;QEMU源码全解析41 —— Machine&#xff08;11&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上一回针对于…

springboot外出务工人员信息管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期间某村外…

前端Vue v-for 的使用

目录 ​编辑 简介 使用方式 基本使用 v-for"(item, index)中item和index作用 示例 迭代对象 示例 结果 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入…

《骑马与砍杀》背包系统实现

一、 效果展示 二、 源代码 1&#xff0c;ItemManager.cs ​​//逻辑简介&#xff1a;该脚本作用是生成背包格子和加载背包物品&#xff0c;获得被拖拽物品和目标物品 //配置&#xff1a;1&#xff0c;需要Scroll View来存放背包物品。 //2&#xff0c;将要作为模板的物品名字…

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…

Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中&#xff0c;基本都会涉及到数据库的开发。QT支持的数据库也有好几种&#xff08;QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7&#xff09;&#xff0c;SQLite就是其中之一&#xff0c;但这个 SQLite 是官方提供的开源版本&#xff0c;没有加密功能的。如果对…