Leetcode553 Optimal Division Java实现

并不是很好的一道题。有点像高考题,故意往错误的方向引导人、挖坑,其实一点都不Medium,发现数学规律后十分的简单。

数学规律:

  1. 所有的分数最后都可以化简为分子上一堆数相乘,分母上也一堆数相乘的形式;
  2. 序列中第一个数一定是在分子上的,第二个数一定是在分母上的。
  3. 形如:a/(b/c/d/...)的分式等价于(a*c*d*...)/b,即只有括号内的第一个数会出现在分母上。
  4. 给的元素都在[2,1000],换句话说都大于1。大于1的数,就想办法让它出现在最终的分子上就好了,这就是本题的BUG。如果给的元素都在[0,1000],那还有得做,甚至十分难了,因为还要把[0,1]的数努力放在分母上。

然而本题没这么复杂,于是剩下的就只是格式化输出了。先给出代码:

public class OptimalDivision553 {
    public String optimalDivision(int[] nums) {
        StringBuilder sb = new StringBuilder();
        sb.append(nums[0]);
        int len = nums.length;
        if(len==1) return sb.toString();
        if(len==2) {
            sb.append('/');sb.append(nums[1]);
            return sb.toString();
        }
        sb.append("/(");sb.append(nums[1]);
        for (int i=2;i<nums.length;i++) {
                sb.append('/');sb.append(nums[i]);
        }
        return sb.append(')').toString();
    }
}

然后为啥这题摔比赞多那么多呢?因为全是坑,除了提醒大家多考虑边界情况外没太大意义…虽然我也中招了吧:当序列只有1个数时不需要除号,只有两个数时不需要括号,这个容易忽略。

最后就只剩下将len==1,2的判断从循环中提出,避免len>2的for循环中每次还要多两次len==的判断,提高效率。

那么如果这个题的元素限制变为[0,1000]呢?该怎么做?

有个初步思路:将序列中的数分两种看待,一种是[1,1000]的数,应该努力将之放在分子上,记作a,另一种是[0,1]的数,记作b。

之后序列变成形如abababbbaaa的形式,对之遍历一遍进行括号分配,就能找出一些规律,比如ab,a已经处理好在分子了,那么b想要去分母,就需要在a的前面加上一个前括号。

找出所有规律,即可解题。

猜你喜欢

转载自www.cnblogs.com/chason95/p/9286048.html