leetcode 481. Magical String

来源:互联网 发布:新疆网络空间安全协会 编辑:程序博客网 时间:2024/05/21 11:01

A magical string S consists of only '1' and '2' and obeys the following rules:

The string S is magical because concatenating(串联) the number of contiguous occurrences(连续出现次数) of characters '1' and '2' generates the string Sitself.

The first few elements of string S is the following: S = "1221121221221121122……"

If we group the consecutive(连续的) '1's and '2's in S, it will be:

1 22 11 2 1 22 1 22 11 2 11 22 ......

and the occurrences of '1's or '2's in each group are:

1 2 2 1 1 2 1 2 2 1 2 2 ......

You can see that the occurrence sequence above is the S itself.

Given an integer N as input, return the number of '1's in the first N number in the magical string S.

Note: N will not exceed 100,000.

Example 1:

Input: 6Output: 3Explanation: The first 6 elements of magical string S is "12211" and it contains three 1's, so return 3.

我本来以为这串数字,之后会有循环,可是写了半天发现没有循环:

num:122112122122112112212112122112112122122112122121121122
occu1 2  2 11 2 1 2  2 1 2  2 11 2 11 2  2 1 2 11 2 1 2  2 11 2 11 2 1 2  2

好吧,那就按照它的规则来构造它。
package leetcode;public class Magical_String_481 {public int magicalString(int n) {if(n==0){return 0;}if(n==1){return 1;}if(n==2){return 1;}if(n==3){return 1;}int[] string=new int[n];int result=0;boolean isOne=true;int pointer=3;int occurrencePointer=2;string[0]=1;string[1]=2;string[2]=2;while(pointer<n){int occurrence=string[occurrencePointer];if(isOne){while(pointer<n&&occurrence>0){string[pointer]=1;pointer++;occurrence--;}isOne=false;}else{while(pointer<n&&occurrence>0){string[pointer]=2;pointer++;occurrence--;}isOne=true;}occurrencePointer++;}for(int i=0;i<n;i++){if(string[i]==1){result+=1;}}return result;}public static void main(String[] args) {// TODO Auto-generated method stubMagical_String_481 m=new Magical_String_481();System.out.println(m.magicalString(7));}}
大神的解法与我类似,但是在1和2的变换使用 num = num ^ 3

因为

1   001  ^ 011  = 010  = 2

2   010  ^ 011  = 001  = 1


原创粉丝点击