力扣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)

posted on 2022-06-07 10:42  我不想一直当菜鸟  阅读(82)  评论(0编辑  收藏  举报