力扣481(java&python)-神奇字符串(中等)
题目:
神奇字符串 s 仅由 '1' 和 '2' 组成,并需要遵守下面的规则:
神奇字符串 s 的神奇之处在于,串联字符串中 '1' 和 '2' 的连续出现次数可以生成该字符串。
s 的前几个元素是 s = "1221121221221121122……" 。如果将 s 中连续的若干 1 和 2 进行分组,可以得到 "1 22 11 2 1 22 1 22 11 2 11 22 ......" 。每组中 1 或者 2 的出现次数分别是 "1 2 2 1 1 2 1 2 2 1 2 2 ......" 。上面的出现次数正是 s 自身。
给你一个整数 n ,返回在神奇字符串 s 的前 n 个数字中 1 的数目。
示例 1:
输入:n = 6
输出:3
解释:神奇字符串 s 的前 6 个元素是 “122112”,它包含三个 1,因此返回 3 。
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/magical-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
一、StringBuilder:
1.定义一个初始的字符串为“122”;
2.定义两个指针,num代表新加入的数字,且num一直指向字符串的末尾,numcount代表新加入数字的个数,且numcount每次只向后移动一位;
3.如果num所指向的数字为 '1',numcount为1,则新加入的数字为 '2',如果numcount为2,则新加入的数字为 '22';
如果num所指向的数字为 '2',numcount为1,则新加入的数字为 '1',如果numcount为2,则新加入的数字为 '11';
4.对字符串的扩展直到字符串的长度大于等于n结束。
规律:
如果前一个数字为1,则新添加的数为2,个数由每一个numcount决定。

代码:
1 class Solution {
2 public int magicalString(int n) {
3 StringBuilder sb = new StringBuilder("122");
4 if(n <= 3) return 1;
5 int count = 1;
6 //定义两个变量都指向字符串的末尾
7 //记录下一个加入的数字是1还是2,每次都指向字符串的末尾
8 int num = sb.length() - 1;
9 //记录加入数字的个数,每次只移动一位
10 int numcount = sb.length() - 1;
11 while(sb.length() < n){
12 num = sb.length() - 1;
13 if(sb.charAt(num) == '1'){
14 sb.append(sb.charAt(numcount) == '1' ? 2 : 22);
15 }else{
16 sb.append(sb.charAt(numcount) == '1' ? 1 : 11);
17 }
18 numcount++;
19 }
20 for(int i = 1; i < n; i++){
21 if(sb.charAt(i) == '1') count++;
22 }
23 return count;
24 }
25 }

二、int[]:
代码:


三、其实跟上面一样的思路,进行模拟
与3进行异或:
1:0001
2:0010
3:0011
2与3进行异或为:0001(1)
1与3进行异或为:0010(2)
java代码:
1 class Solution {
2 public int magicalString(int n) {
3 if(n <= 3) return 1;
4 int[] array = new int[n+1];
5 array[0] = 1;array[1] = 2; array[2] = 2;
6 //当前最后一个元素为2
7 char c = 2;
8 //前三个数有一个1
9 int count = 1;
10 //i:当前最后一个元素位置, j:下一个元素位置
11 for(int i = 2,j = 3; j < n; i++){
12 //下一个元素的值
13 c ^= 3;
14 array[j++] = c;
15 if(array[i] == 2) array[j++] = c;
16 }
17 for(int i = 3; i < n; i++){
18 if(array[i] == 1) count++;
19 }
20 return count;
21 }
22 }

python3代码:
1 class Solution:
2 def magicalString(self, n: int) -> int:
3 array = [1,2,2]
4 # i代表最后一个位置的索引
5 i = 2
6 while len(array) < n:
7 # 得到下一个的数字
8 c = array[-1] ^ 3
9 # 将新字符与原来的字符拼接
10 array += [c] * array[i]
11 # 将i移动到下一个位置
12 i += 1
13 return array[:n].count(1)

力扣481(java&python)-神奇字符串(中等)的更多相关文章
- 力扣(LeetCode)415. 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...
- 力扣(LeetCode)旋转字符串 个人题解
给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...
- 力扣题目汇总(反转字符串中的单词,EXCEL表列序号,旋置矩阵)
反转字符串中的单词 III 1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode ...
- 力扣(LeetCode)翻转字符串里的单词 个人题解
给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输 ...
- 力扣(LeetCode)亲密字符串 个人题解
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...
- Java实现 LeetCode 481 神奇字符串
481. 神奇字符串 神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几 ...
- Leetcode 481.神奇字符串
神奇字符串 神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几个元素如下 ...
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数
最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...
随机推荐
- Spring 中不得不了解的姿势
说明 本文非原创,我只是进行了整理以及做了一些改动,仅供学习,若需进行商业使用,请联系原作者 原作者:苏三 原文链接:苏三说技术:Spring系列 Spring IOC 本章节解读的流程为Spring ...
- manjaroLinux-xfce4设置显示桌面快捷键
1.打开窗口快捷键 2.寻找显示桌面 3.设置快捷键 啊!简单的我都不想写了,这不是为让像以前的"我"--小白,食用性更好一点吗?
- Mysql查询数据量大小
--按实例 SELECT CONCAT(round(sum(DATA_LENGTH/1024/1024/1024),2),"GB") as datazise FROM inform ...
- posix API的一些理解
TCP Posix API的理解 我们主要从TCP连接讲解整个的流程. 连接的建立 消息的收发 连接的断开 连接的建立 先看一下一个TCP server的创建过程. #include<stdio ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第2章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 出处:2.2.6 Windows内存布局 原文: segment heap:用于Universal Windows Platform程序,它提供了 ...
- 手机,IPAD查看eagle素材库
把eagle素材库塞进手机里是一种什么样的体验?手机和ipad也能查看eagle素材库,随时随地查询浏览素材. 先看使用截图 实现原理: 在任意电脑,服务器或者nas中安装PicHome系统.在Pic ...
- Oracle regexp_replace 手机号脱敏
select '18012345678',regexp_replace('18012345678','(.){4}','****',4,1) from dual;
- KingabseES例程-函数和过程的 INVOKER 与 DEFINER
调用者权利和定义者权利子句 指定子程序的权利属性.权利属性影响单元在运行时,执行的SQL语句的名称解析和权限检查. PG模式: SECURITY INVOKER SECURITY DEFINER Or ...
- sublime text 笔记
问题: Sublime Text编辑器开启或关闭Vim模式 插件: 使用sublime server启动本地服务器进行调试
- 开源共建携手并进 OpenHarmony使能千行百业生态成果亮相HDC2022
11月4日-6日,第四届华为开发者大会 2022(Together)在中国松山湖如期举行,本次大会围绕"创新照见未来"这一主题,向外界展示了OpenAtom OpenHarmon ...