囧囧算法

LC-01-第 N 个泰波那契数-字母板上的路径

2019-07-29  本文已影响0人  囧么肥事

年轻即出发...

简书https://www.jianshu.com/u/7110a2ba6f9e

知乎https://www.zhihu.com/people/zqtao23/posts

GitHub源码https://github.com/zqtao2332

个人网站http://www.zqtaotao.cn/ (停止维护更新内容)

QQ交流群:606939954

​ 咆哮怪兽一枚...嗷嗷嗷...趁你现在还有时间,尽你自己最大的努力。努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。也许我们始终都只是一个小人物,但这并不妨碍我们选择用什么样的方式活下去,这个世界永远比你想的要更精彩。

最后:喜欢编程,对生活充满激情



本节内容预告

实例1:5139. 第 N 个泰波那契数

实例2:5140. 字母板上的路径



5139. 第 N 个泰波那契数

原题:https://leetcode-cn.com/contest/weekly-contest-147/problems/n-th-tribonacci-number/

泰波那契序列 Tn 定义如下:

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:

输入:n = 25
输出:1389537

提示:

    public static int tribonacci(int n) {
        if (n == 0) return 0;
        if (n == 1 || n == 2) return 1;

        int a = 0;
        int b = 1;
        int c = 1;
        int res = 0;
        for (int i = 3; i <= n; i++) {
            res = a + b+ c;
            a = b;
            b = c;
            c = res;
        }
        return res > Integer.MAX_VALUE ? -1 : res;
    }

5140. 字母板上的路径

原题:https://leetcode-cn.com/contest/weekly-contest-147/problems/alphabet-board-path/

我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]

在本题里,字母板为board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"].

我们可以按下面的指令规则行动:

返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。

示例 1:

输入:target = "leet"
输出:"DDR!UURRR!!DDD!"

示例 2:

输入:target = "code"
输出:"RR!DDRR!UUL!R!"

提示:

1、看做6个桶,前5个桶,每个桶里面5个位置
2、最后一个桶只有一个元素,涉及到左右移动时,需要提前处理
    public static String alphabetBoardPath(String target) {
        char[] chars = target.toCharArray();
        int tIndex = 0; // 桶指针
        int pIndex = 0; // 桶内具体位置指针
        int tong = 0; // 桶号
        int p = 0; // 桶内位置号

        String res = "";
        for (char c : chars) {
            int num = c - 'a';
            p = num % 5; // 桶内目标位置
            tong = num / 5; // 桶

            // 移动桶
            String stong = tIndex >= tong ? "U" : "D"; // 上下方向
            int tmp1 = Math.abs(tIndex - tong);
            // 移动位
            String snum = pIndex >= p ? "L" : "R"; // 左右方向
            int tmp2 = Math.abs(pIndex - p);

            if (tong == 5 && Math.abs(p - pIndex) > 0) { // 针对最后一个z 进行处理,先进行左右移动,在进行上下移动
                while (tmp1 > 1) {
                    res += stong;
                    tmp1--;
                }
            } else {
                while (tmp1 > 0) {
                    res += stong;
                    tmp1--;
                }
            }

            while (tmp2 > 0) {
                res += snum;
                tmp2--;
            }

            if (tmp1 > 0) { // z 处理最后一次上下移动
                res += stong;
            }

            tIndex = tong; // 更新桶位置
            pIndex = p; // 更新移动位置

            res += "!";
        }
        return res;
    }
上一篇 下一篇

猜你喜欢

热点阅读