【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)
---------------------------------------------------------------------------------------------------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现