zoukankan      html  css  js  c++  java
  • 【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
    };
  • 相关阅读:
    sqlhelper使用指南
    大三学长带我学习JAVA。作业1. 第1讲.Java.SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行 大三学长带我学习JAVA。作业1.
    pku1201 Intervals
    hdu 1364 king
    pku 3268 Silver Cow Party
    pku 3169 Layout
    hdu 2680 Choose the best route
    hdu 2983
    pku 1716 Integer Intervals
    pku 2387 Til the Cows Come Home
  • 原文地址:https://www.cnblogs.com/seyjs/p/9071067.html
Copyright © 2011-2022 走看看