【leetcode】838. Push Dominoes


題目如下:

 

 

解題思路:本題題目中有一點要求很關鍵,“we will consider that a falling domino expends no additional force to a falling or already fallen domino.”,正好對應題目中的例子2,要好好理解一下。因為輸入的最大dominoes是10^5,所以要考慮性能問題。dominoes有三種狀態:'R','L','.'。在最終狀態里面,R和L是不會變的,只有'.'的狀態可能會變成三種狀態的任意一種。我的思路是把所有連續的'.'當做一個子序列,然后判斷這個子序列左邊和右邊的dominoes是R還是L,這里分這么幾種情況:

a.左右的dominoes方向相同,那么子序列所有的'.'的方向和左右方向相同;

b.左邊的dominoes向右,右邊的dominoes向左,如下圖,那么要考慮子序列長度是奇偶性來決定最中間的'.'的取值。如下圖,

c.子序列出現要頭尾要單獨考慮;

d.左邊的dominoes向左,右邊的dominoes向右,那么子序列所有的'.'的方向保持不變,還是為'.';

最后,出現一個很奇怪的問題,按照我的思路寫出的python代碼會TEL,但是js代碼確能AC,不知道是什么原因。

代碼如下:

Python -> 

class Solution(object):
    def pushDominoes(self, dominoes):
        """
        :type dominoes: str
        :rtype: str
        """
        dl = '#' + dominoes + '#'
        start = end = None
        res = ''
        for i in xrange(len(dl)):
            if dl[i] !=  '.': #first opmitize
                if start != None:
                    end = i - 1
                else:
                    if dl[i] != '#':
                        res += dl[i]
                if start != None and end != None:
                    if dl[start-1] == dl[end+1] and dl[start-1] != '#':
                        res += (end-start+1)*dl[start-1]
                    elif dl[start-1] == 'R' and dl[end+1] == 'L':
                        if (end - start) % 2 != 0:
                            mid = (end - start + 1) / 2
                            res += 'R'*mid
                            res += 'L'*mid
                        else:
                            mid = (end - start + 1) / 2
                            res += 'R' * mid
                            res += '.'
                            res += 'L' * mid
                    elif dl[start-1] == '#' and dl[end+1] == 'L':
                        res += 'L'*(end-start+1)
                    elif dl[end+1] == '#' and dl[start-1] == 'R':
                        res += 'R' * (end - start + 1)
                    else:
                        res += '.' * (end - start + 1)
                    if dl[i] != '#':
                        res += dl[i]
                    start = end = None
            else:
                if start == None:
                    start = i
        return res

js ->

var pushDominoes = function(dominoes) {
    var dl = '#' + dominoes + '#'
    var start = end = undefined
    var res = ''
    for(var i = 0;i < dl.length;i++){
        if(dl[i] != '.'){
            if (start != undefined){
                end = i - 1
            }
            else{
                if (dl[i] != '#'){
                    res += dl[i]
                }
            }
            if (start != undefined && end != undefined){
                if (dl[start-1] == dl[end+1] && dl[start-1] != '#'){
                    //res += (end-start+1)*dl[start-1]
                    res += dl[start-1].repeat(end-start+1)
                }
                else if (dl[start-1] == 'R' && dl[end+1] == 'L'){
                    if ((end - start) % 2 != 0){
                        mid = (end - start + 1) / 2
                        //res += 'R'*mid
                        //res += 'L'*mid

                        res += 'R'.repeat(mid)
                        res += 'L'.repeat(mid)
                    }
                    else{
                        mid = (end - start + 1) / 2
                        //res += 'R' * mid
                        //res += 'L' * mid

                        res += 'R'.repeat(mid)
                        res += '.'
                        res += 'L'.repeat(mid)
                    }
                }
                else if(dl[start-1] == '#' && dl[end+1] == 'L'){
                    //res += 'L'*(end-start+1)
                    res += 'L'.repeat(end-start+1)
                }
                else if(dl[end+1] == '#' && dl[start-1] == 'R'){
                    //res += 'R' * (end - start + 1)
                    res += 'R'.repeat(end-start+1)
                }
                else{
                    //res += '.' * (end - start + 1)
                    res += '.'.repeat(end-start+1)
                }
                if (dl[i] != '#'){
                    res += dl[i]
                }
                start = end = undefined
            }
        }
        else{
            if (start == undefined){
                start = i
            }
        }
    }
    return res
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM