leetcode 481. Magical String

257 篇文章 17 订阅

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: 6
Output: 3
Explanation: 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 stub
		Magical_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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值