数数并说(Count And Say)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whitesun123/article/details/79999618

报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

给定一个正整数 n ,输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

解法一:乱糟糟版

public String countAndSay(int n) {
        if( n == 1)
        	return "1";
        StringBuffer start= new StringBuffer();
        start.append("1");
        int flag = 1;
        StringBuffer result = new StringBuffer();
		for(int i = 1; i < n; i++){
			flag = 1;//1
			result.delete(0, result.length());//2
			for(int j = 0;j < start.length(); j++){//3
				if( j+1 < start.length() &&  start.charAt(j) == start.charAt(j+1)){
					flag++;
					
				}
				else{
					
					result.append(flag);
					result.append(start.charAt(j));
					flag = 1;
					
				}
				
												
			}
			start.delete(0, start.length());//4 start = result
			System.err.println("result="+result);
			for(int z = 0; z < result.length() ; z++){
				start.append(result.charAt(z));
			}
			System.err.println("start="+start);
			
			
		}
		return result.toString();
		
        
    	
    }

解法二:优化版

public String countAndSay_2(int n) {
        if( n == 1)
        	return "1";
        String result = "1";
        for(int i = 1; i < n; i++){
        	result = getString(result);
        }
		return result;										
		
        
    	
    }
    private String getString(String result) {
		// TODO Auto-generated method stub
    	int flag = 1;
    	StringBuffer sb = new StringBuffer();
		for(int i = 0; i< result.length(); ){
			if(i +1 < result.length() && result.charAt(i) == result.charAt(i+1)){
				flag++;
				i++;
				
			}
			else{
				sb.append(flag).append(result.charAt(i));
				flag = 1;
				i += flag;
			}
			
			
		}
		System.out.println(sb);
		return sb.toString();
	}




猜你喜欢

转载自blog.csdn.net/whitesun123/article/details/79999618