题目:

神奇字符串 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)-神奇字符串(中等)的更多相关文章

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

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...

  2. 力扣(LeetCode)旋转字符串 个人题解

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  3. 力扣题目汇总(反转字符串中的单词,EXCEL表列序号,旋置矩阵)

    反转字符串中的单词 III 1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode ...

  4. 力扣(LeetCode)翻转字符串里的单词 个人题解

    给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输 ...

  5. 力扣(LeetCode)亲密字符串 个人题解

    给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...

  6. Java实现 LeetCode 481 神奇字符串

    481. 神奇字符串 神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几 ...

  7. Leetcode 481.神奇字符串

    神奇字符串 神奇的字符串 S 只包含 '1' 和 '2',并遵守以下规则: 字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身. 字符串 S 的前几个元素如下 ...

  8. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  9. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  10. 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数

    最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...

随机推荐

  1. C++统计代码运行时间

    本来想自己写的,一看github上面都有就不再重复造轮子了.github上的项目如下: StopWatch 纯标准库实现:使用std::chrono::high_resolution_clock,其实 ...

  2. Windows App SDK? C++/WinRT? 狗都不学!

    空荡荡的官网开发文档,打开直接心凉一截! 只写个Hello World教程就敢宣布自己为"跨时代"新产品? 什么"C++桌面开发者的狂欢"?什么Project ...

  3. ARM的无线ble IP Cordio-B50 stack and profiles简析

    一 简介 人家英文写的很清楚,我就不蹩脚额翻译了. Cordio-B50 stack is designed specifically for Bluetooth low energy single- ...

  4. linux系统运行时参数命令、网络、磁盘参数和日志监控

    重点内容 linux基础命令和工具 CPU性能监控 内存性能监控 文件IO性能监控 网络IO监控 1 linux基础命令和工具 1.1 Grep搜索字符 grep命令用于在文件中执行关键字搜索,并显示 ...

  5. 关于linux在笔记本下耗电的解决方案(只写我实践的部分)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2014-09-22 12:02:54 ...

  6. vmware虚拟机共享文件夹显示不出来的解决办法

    今天在虚拟机里部署测试环境时,遇到一个问题,就是在vmware设置里明明共享了文件夹,但是在CentOS里却看不到共享的文件夹 环境 宿主机:MacBook Pro 虚拟机:vmware 15 虚拟机 ...

  7. java的接口和抽象类区别

    转自:深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在 ...

  8. 2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想

    2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣. 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组. 每组中的物品只能选择1件,现在他想 ...

  9. XSS 从 PDF 中窃取数据

    XSS 从 PDF 中窃取数据 将服务器端 XSS 注入到动态生成的 PDF 中 在 hack the box 的 Book 机器(Scripting Track)上,我遇到了一个 Web 应用程序, ...

  10. 记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 因公司业务需要,需要开发水印相机功能,而项目代码用的uniapp框架,App端只能简单调用系统的相机,无法自定义界面,在此基础上,只能开发 ...