题目:

神奇字符串 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. 表单验证 validate 两种 一种是callback配合外部变量,当同步用。第2中是 then async await 这种 真正$api也适用

    validateFormRealProcessLeft () { let ret = false this.$refs.xxx.validate((valid) => { if (valid) ...

  2. c语言中静态链接库的创建和使用

    静态链接库的创建 静态链接库其实就相当于压缩包,其内部可以包含多个源文件.但需要注意的是,并非任何一个源文件都可以被加工成静态链接库,其至少需要满足以下 2 个条件: 源文件中只提供可以重复使用的代码 ...

  3. Android 混淆打包后gson报错Missing type parameter

    原文: Android 混淆打包后gson报错Missing type parameter - Stars-One的杂货小窝 记录一个简单的bug 在代码中使用了gson将json转为list: va ...

  4. day04-应用线程03

    JavaGUI-坦克大战04 7.线程的应用03 7.3坦克大战4.0版 7.3.4功能3:敌方坦克自由移动 功能3:让敌人的坦克也可以自由随机地上下左右移动 思路: 因为要求敌人的坦克自由移动,因此 ...

  5. Ubuntu 14.04 升级到Gnome3.12z的折腾之旅(警示后来者)+推荐Extensions.-------(二)

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

  6. 详解在 centos 中引导到救援模式

    详解在 centos 中引导到救援模式 Linux系统CentOS进入单用户模式和救援模式详解 一.概述 目前在运维日常工作中,经常会遇到服务器异常断电.忘记root密码.系统引导文件损坏无法进入系统 ...

  7. 项目性能优化—使用JMeter压测SpringBoot项目

    项目性能优化-使用JMeter压测SpringBoot项目 我们的压力测试架构图如下: 配置JMeter 在JMeter的bin目录,双击jmeter.bat 新建一个测试计划,并右键添加线程组: 进 ...

  8. 记录--Vue3 + Fabricjs 定制国庆专属头像

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 生在国旗下,长在春风里!国庆将至,采黎为大家带来 定制头像2.0(国庆头像),让我们用代码的形式为祖国庆生!欢迎大家点赞收藏加关注哦 前言 ...

  9. 记录--vue3+setup+ts 知识总结

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 vue3 于 2020 年 09 月 18 日正式发布,2022 年 2 月 7 日 vue3 成为新的默认版本 距离 vue3 正式发布 ...

  10. 开发必会系列:J2EE是什么

    为什么Java是跨平台的? 高级语言通过编译器,转为汇编语言,汇编语言通过汇编器转为0和1. 当c转为汇编时,不同厂家cpu,用不同的指令集,所以有不同的汇编语言结果,导致c不能跨平台. java在各 ...