Tuesday, September 8, 2015

Count and Say

1. Example
Count and Say(when not equal and string builder append)
1,11,21,1211,111221
1 => one 1 => 11
11=> two 1=>21
21=> one two one one=> 1211
so its String.value(count)+"1 or 2" and convert it to int
Given an integer n, generate the nth sequence
like n = 2=> "11"
like n =4 =>"1211"


2. Implementation
Q1: how to count?
A1: an array count array count[value-1], count[0] =? , count[1]=?
Q1: how to iterate?
A1: top-down approach, for loop, return a string, int next = "1", int[] count = new int[2]
str.charAt(i), i < length(), count[(int)(str.charAt(i)-'0')-1]++;



// NOTE: every index correspond to an number

 for (int i =2 ; i <= n; i++ ) // i=1 already appear pre = "1"

// NOTE: when equal, count is already two
 int count =1;



for (int j =1 ;j < pre.length; i++) {
 //count[((int)(pre.charAt(j)-'0')) - 1]++; 
 if ( pre.charAt(j) == pre.cahrAt(j-1) ) count++;


// NOTE: if all the same or the last count 
 res.append(count);
 res.append( res.charAt(pre.length()-1) ); 
 pre = res.toString();
// Time:O(n*string length), Space:O(string length) stringbuilder
public String countAndSay(int n)
{
      



       //vlaidate teh input
       if ( n <= 0 )
              return "";



       
       String pre = "1";// 1st
       //for ( int i = 2 ; i < n; i++)
       // NOTE: every index correspond to an number 
       for (int i =2 ; i <= n; i++ )
       {




             //int[] count = new int[2];
             // NOTE: when equal, count is already two 
             int count =1;
             // NOTE:
             StringBuilder res = new StringBuilder();



             //for (int j = 0 ; j < pre.length; j++)
             // NOTE: contiguous counts
             for (int j =1 ;j < pre.length; i++)
             {
                    //count[((int)(pre.charAt(j)-'0')) - 1]++;
                    if (  pre.charAt(j) == pre.cahrAt(j-1)  )
                       count++;
                    else 
                    {
                          res.append(count);
                          res.append(pre.charAt(j-1));
                          count =1; //reset
                    }
             }
             //StringBuilder sb = new StringBuilder();
             //if (count[0] != 0)
             //{
             //    sb.append(count[0]);
             //    sb.append(1);            
             //}
             //if (count[1] != 0)
             //{
             //    sb.append(count[1]);
             //    sb.append(2);
             //}
             

             
             // NOTE: if all the same or the last count
             res.append(count);
             res.append( res.charAt(pre.length()-1) );
             pre = res.toString();
       }




       return pre;


       
} 
3. Similar Ones
(M) Encode and Decode Strings

No comments:

Post a Comment