【1031】

481. 神奇字符串

神奇字符串 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
---------------------------------------------------------------------------------------------------------------
首先要构造神奇字符串,可以看到12211……,分组之后 1 22 11,第一位1是第一组1,第二位2是第二组22,第三位2是第三组的11,所以之后第四组应该由第四位1确定,且1和2交替出现,则第四组是2,第五组是1……以此类推。
复制代码
 1 class Solution {
 2     public int magicalString(int n) {
 3         if(n < 4){
 4             return 1;
 5         }
 6         char[] chars = new char[n+2];
 7         chars[0] = 1;
 8         chars[1] = 2;
 9         chars[2] = 2;
10         for(int i = 2, j = 3; j < n; i++){
11             if(chars[i] == 1){
12                 chars[j] = (char)(chars[j-1] ^ 3);//得到int强转为char,异或运算(其实可以直接使用int数组存放,但是会多使用1MB的内存空间)
13                 j++;
14             }else if(chars[i] == 2){
15                 chars[j] = (char)(chars[j-1] ^ 3);
16                 chars[j+1] = (char)(chars[j-1] ^ 3);
17                 j+=2;
18             }
19         }
20         int res = 0;
21         for(int i = 0; i < n; i++){
22             if(chars[i] == 1){
23                 res++;
24             }
25         }
26         return res;
27     }
28 }
复制代码

 



---------------------------------------------------------------------------------------------------------------
另一个博主写的,方法更简单一些

class Solution {
public int magicalString(int n) {
char[] s = new char[n + 2];
s[0] = 1; s[1] = s[2] = 2;
char c = 2;
for (int i = 2, j = 3; j < n; ++i) {
c ^= 3; // 1^3=2, 2^3=1,这样就能在 1 和 2 之间转换
s[j++] = c;
if (s[i] == 2) s[j++] = c;
}
int ans = 0;
for (int i = 0; i < n; ++i) ans += 2 - s[i]; // 2-1=1,2-2=0,这样就只统计了 1
return ans;
}
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/magical-string/solutions/1938214/by-endlesscheng-z8o1/
来源:力扣(LeetCode)

---------------------------------------------------------------------------------------------------------------

posted @   Wianxhlyl  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示