class Solution:
    def compress(self, chars: List[str]) -> int:
        l = r = 0
        size = len(chars)
        cnt = 1
        for r in range(1,size+1):
            if r < size and chars[r] == chars[r-1]:
                cnt += 1 
            else:
                chars[l] = chars[r-1]
                l += 1
                if cnt > 1:
                    for x in str(cnt):
                        chars[l] = x
                        l += 1 
                cnt = 1
        #chars = chars[:l]
        #print(chars)
        return l 


class Solution:
    def compress(self, chars: List[str]) -> int:
        l = 0
        cnt = 1 
        n = len(chars)
        if n < 2:
            return n
        for r in range(1,n):
            # if current is diff from prev, update cnt  
            if chars[r] == chars[r-1]:
                cnt += 1 
            else:
                #discuss about cnt 
                l += 1 
                if cnt > 1:
                    # add cnt (can be '12'=> '1','2') 
                    for c in str(cnt):
                        chars[l] = c
                        l += 1
                # left go to new char 
                chars[l] = chars[r]
                cnt  = 1
        # handle tail part of chars 
        if cnt != 1:
            for c in str(cnt):
                l+= 1
                chars[l] = c
        
        return l+1 # l is  0-based  idx


class Solution:
    def compress(self, chars: List[str]) -> int:
        wp = rp = 0
        n = len(chars)
        while rp < n:
            chars[wp] = chars[rp]
            ch = chars[wp]
            cnt = 0
            while rp < n and ch == chars[rp]:
                rp +=  1
                cnt += 1 
            # case1 rp == n
            
            #  cnt == 1 
            chars[wp] = ch
            wp += 1
            
            # case2 chars[rp] != ch 
            if cnt > 1:
                for c in str(cnt):
                    chars[wp] = c 
                    wp += 1
        return wp