力扣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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)