力扣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 说 ...
随机推荐
- GO 语言的并发编程相关知识点简介与测试【GO 基础】
〇.什么是协程 Coroutines ? 进程和线程太常见,本文就不再赘述了,直接一起看下什么是协程.如下图,先看下协程的定位: 关于用户空间和内核空间:进程运行起来就涉及到对内存资源的管理,然而内存 ...
- Harris/Shi-Tomasi角点检测
机器视觉--角点检测 什么是角点检测 在几何学里,我们会看到各种各样的三角形.多边形等,它们都有一个显著的特征:包含了角点信息.比如在三角形里,我们有三个角:在矩形里,我们有四个角.我们将找到这些图像 ...
- 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家!
根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛,最终获奖结果出炉啦. 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份.在宣布最 ...
- drf(JWT认证)
一. jwt实现过程 1. 构建jwt过程 第一: 用户提交用户名和密码给服务端,如果登录成功,使用jwt创建一个token,并给用户返回 eyJ0eXAiOiJqd3QiLCJhbGciOiJIUz ...
- 记录--ThreeJs手搓一个罗盘特效
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 先上效果 前言 最近在学Three.js.,对着文档看了一周多,正好赶上码上掘金的活动,就顺便写了一个小demo,手搓一个罗盘特效. 太极 ...
- 记录--手写$forceUpdate,vm.$destroy方法
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 vm.$forceUpdate (1)作用 迫使Vue.js实例重新渲染.注意它仅仅影响实例本身以及插入插槽内容的子组件,而不是所有子组件 ...
- 基于logisim-D触发器设计四人抢答电路
实验1:设计一个简易4人知识竞赛抢答电路,要求是: 裁判掌握一个按钮,作用是给电路复位和发出抢答开始命令;4名竞赛者各掌握一个按钮,每人对应一个指示灯,在主持人发出开始抢答命令后,哪位参赛者先按钮其对 ...
- 终于来了!FastGPT 正式兼容 GPT 应用
终于来了!FastGPT 正式兼容 GPT 应用 FastGPT V4.7 正式加入了工具调用功能,可以兼容 GPTs 的 Actions.这意味着,你可以直接导入兼容 GPTs 的 Agent 工具 ...
- C++中自定义事件与委托
自定义事件,和委托其实是一类操作. 在蓝图中都表现为红色方块. 自定义事件通过DECLARE_EVENT(ClassName, EventName)来创建一个属于ClassName的EventName ...
- 鸿蒙HarmonyOS实战-ArkUI组件(List)
一.List 1.概述 列表是一种非常有用且功能强大的容器,它常用于呈现同类型或多类型数据集合,例如图片.文本.音乐.通讯录.购物清单等.列表对于显示大量内容而不耗费过多空间和内存是非常有帮助的,因为 ...