LeetCode题 338比特位计数,20有效的括号,415字符串相加

目录

338比特位计数

题目要求:

解题思路:

1、暴力穷举

代码:

2、N&(N - 1)公式求解

代码:

3、奇偶数性质解法:

代码:

20有效的括号

题目要求:

解题思路

代码:

415字符串相加

题目要求

解题思路

代码:


338比特位计数

题目要求:

连接:338. 比特位计数 - 力扣(LeetCode)

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例 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

解题思路:

1、暴力穷举

遍历一遍 1 到 n,把里面的元素按位与上一个1,如果等于1,则说明当前i的末尾是1,用计数器记录下来,不是则不记录下来,然后再右移1位,如图:

代码:

public int[] countBits(int n) {int[] array = new int[n + 1];array[0] = 0;for(int i = 1; i <= n; i++) {int x = i;int count = 0;while(x > 0) {if((x & 1) == 1) {count++;}x >>= 1;}array[i] = count;}return array;}

2、N&(N - 1)公式求解

如图:

解释:如果我们求21的二进制1的个数,那么就可以求20的二进制1的个数 + 1,求20的二进制1的个数就可以求16的二进制1的个数 + 1,求16的二进制1的个数就可以求0的二进制1的个数 + 1,所以,我们得到求某一数字N的二进制1的个数:(N &(N - 1))+ 1

代码:

public int[] countBits(int n) {int[] array = new int[n + 1];array[0] = 0;for(int i = 1; i < array.length; i++) {array[i] = array[i & (i-1)] + 1;}return array;}

3、奇偶数性质解法:

如图:

i = 5,7时,是奇数,观察上图可以发现,他们的二进制1的个数是 i 的前一个下标4,5的二进制1的个数 + 1。

所以当 i 是奇数时,我们就算它前一个下标的二进制个数+1就好了。

我们可以发现,i 为偶数时,他们的二进制1的个数和 i 右移一位(或者除 2)的二进制1的个数一样。

所以 i 为偶数时,我们算它右移一位的数二进制1个个数就好了。

代码:

public int[] countBits(int n) {int[] arr = new int[n + 1];arr[0] = 0;for(int i = 1; i < arr.length; i++) {arr[i] = (i & 1) == 1 ? arr[i - 1] + 1 : arr[i >> 1];}return arr;}

20有效的括号

题目要求:

连接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

解题思路

利用栈的这种数据结构,对比前一个括号左是否和当前的右括号匹配,利用栈的先进后出的特性,当遇到一个左括号,就放进栈里面一个右括号,取到的字符是右括号时,就判断这个这个右括号和栈里的栈顶元素是否相等,不相等就返回false,相等就弹出,继续下一次判断,。字符串没遍历完,如果栈为空了,则是右括号多了,返回false,如果字符串遍历完了,但是栈不为空,则是左括号多了,返回false。

代码:

public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(char x : s.toCharArray()) {if(x == '(') {stack.push(')');} else if(x == '[') {stack.push(']');} else if(x == '{') {stack.push('}');} else if(stack.empty() || stack.pop() != x) {return false;}}return stack.empty();}

415字符串相加

题目要求

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

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

你不能使用任何內建的用于处理大整数的库(比如 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
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零

解题思路

要把两个字符串数字相加,再放进字符串中,返回字符串类型,那么就需要把这两个字符串分别取出来,然后求出两字符串的长度 - 1,定义为下标,从后往前进行遍历(arr.length()),同时遍历他们,每次都要取出当前下标的字符,然后当前下标字符再减去'0'下标字符,就是这个字符的的整型数字了,ASCLL表如图

再定义一个进位遍历carry,拿到当前下标的两字符数字(x + y + carry),定义一个StringBuilder类型,把(x + y + carry)放进这个类里面,再和carry相加 % 10,

carry = (x + y +carry)/ 10,每遍历一次下标,都要执行以上操作,当字符串遍历完时,逆转这个字符串,再返回这个字符串。

代码:

public String addStrings(String num1, String num2) {StringBuilder sb = new StringBuilder();//记录进位的变量int carry = 0;//记录字符串的下标int n1 = num1.length() - 1;int n2 = num2.length() - 1;for(; n1 >= 0 || n2 >= 0 || carry != 0; n1--, n2--) {int c1 = (n1 < 0) ? 0 : (num1.charAt(n1) - '0');int c2 = (n2 < 0) ? 0 : (num2.charAt(n2) - '0');sb.append((c1 + c2 + carry) % 10);carry = (c1 + c2 + carry) / 10;}//翻转字符串return sb.reverse().toString();}

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

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

相关文章

【杂谈】-蓝牙低功耗数据传输模式比较

蓝牙低功耗数据传输模式比较 文章目录 蓝牙低功耗数据传输模式比较1、无连接数据传输2、无连接数据传输的优点3、无连接数据传输的局限性 3、面向连接的数据传输4、面向连接模式的优点5、面向连接模式的局限性6、家庭自动化项目的性能观察 物联网&#xff08;IoT&#xff09;设…

30 位学者合力发表 Nature 综述,10 年回顾解构 AI 如何重塑科研范式

科学发现是一个复杂过程&#xff0c;涉及到几个相互关联的阶段&#xff0c;包括形成假设、实验设计、数据收集及分析。近年来&#xff0c;AI 与基础科研的融合日益加深&#xff0c;借助 AI&#xff0c;科学家得以加速科研进度、促进科研成果的落地。 权威期刊「Nature」刊登了…

第07章 面向对象编程(进阶)

一 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解&#xff0c;它的作用和其词义很接近。 它在方法&#xff08;准确的说是实例方法或非static的方法&#xff09;内部使用&#xff0c;表示调用该方法的对象。它在构造器内部使…

【数据结构(二)】稀疏 sparsearray 数组(1)

文章目录 1. 稀疏数组的应用场景1.1. 一个实际的需求1.2. 基本介绍 2. 稀疏数组转换的思路分析3. 稀疏数组的代码实现3.1. 二维数组转稀疏数组3.2. 稀疏数组转二维数组 4. 课后练习 1. 稀疏数组的应用场景 1.1. 一个实际的需求 问题&#xff1a;     编写的五子棋程序中&…

长短期记忆(LSTM)与RNN的比较:突破性的序列训练技术

长短期记忆&#xff08;Long short-term memory, LSTM&#xff09;是一种特殊的RNN&#xff0c;主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说&#xff0c;就是相比普通的RNN&#xff0c;LSTM能够在更长的序列中有更好的表现。 Why LSTM提出的动机是为了解…

原论文一比一复现 | 更换 RT-DETR 主干网络为 【VGG13】【VGG16】【VGG19】| 对比实验必备

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 论文地址:https://arxiv.o…

ARM 版 Kylin V10 部署 KubeSphere 3.4.0 不完全指南

前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版麒麟 V10 安装部署 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ksp-master-1172.16.33.1681650200KubeSphere/k8…

数据结构树与二叉树的实现

目录 一、普通树的存储结构 1、双亲表示法 2.孩子表示法 二、二叉树 1.二叉树的顺序存储&#xff08;必须是完全二叉树&#xff0c;否则很浪费空间&#xff09; 1&#xff09;结构体 2.二叉树的链式存储 1&#xff09;结构体 2&#xff09;操作 1.创建一颗二叉树 2.创…

侧面多级菜单(一个大类、一个小类、小类下多个物体)

效果&#xff1a; 说明&#xff1a; 左右侧面板使用Animator组件控制滑入滑出。左侧面板中&#xff0c;左的左里面是大类&#xff0c;左的右有绿色的小类&#xff0c;绿色的小类下有多个真正的UI图片按钮。 要点&#xff1a; 结合了一点EasyGridBuilderPro插件的UI元素&…

数字艺术藏品软件的独特创新与未来趋势

随着科技的飞速发展&#xff0c;数字艺术藏品软件逐渐崭露头角&#xff0c;为艺术爱好者们提供了一个全新的收藏方式。这类软件不仅为艺术家提供了展示作品的平台&#xff0c;也为收藏家们提供了收藏和分享艺术品的渠道。本文将从开发思路、技术实现、市场前景等方面探讨数字艺…

业务流程图用什么软件画?这10款流程图软件,好用到飞起!

业务流程图是什么&#xff1f; 业务流程图是一种用于表示业务过程中活动流向的图形表示方法&#xff0c;它使用标准化的图形元素&#xff08;如箭头、椭圆、方框等&#xff09;来表达一个过程中各个环节之间的关系。在这个图形表示中&#xff0c;每个元素都有特定的含义和功能…

(论文阅读)TiDB:一款基于Raft的HTAP数据库

引言 混合事务分析处理&#xff08;HTAP&#xff09;数据库要求隔离处理事务查询和分析查询&#xff0c;以消除它们之间的干扰。要实现这一点&#xff0c;有必要维护为这两种查询类型指定的数据的不同副本。然而&#xff0c;为存储系统中的分布式副本提供一致的视图是一项挑战…