栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【每日一题】Day0007:力扣NO.1518+CSDN每日一练

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【每日一题】Day0007:力扣NO.1518+CSDN每日一练

今天题目似乎都简单不少于是多做了几题。Java目前学到集合与泛型阶段了。

先上力扣的题目链接:

力扣https://leetcode-cn.com/problems/water-bottles/经典的换酒瓶问题,过于简单,迭代也可以不过解这题完全没必要了。代码如下:

package cn.daycode.leetcode;

public class NumWaterBottles{
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.numWaterBottles(2,5));
    }
}

class Solution {
    public int numWaterBottles(int numBottles, int numExchange) {
        int drinkedNumbers = numBottles; // 先把已有的所有酒喝掉

        while(numBottles >= numExchange){ // 如果现有的空酒瓶够换至少1瓶就去换,别犹豫
            drinkedNumbers  += numBottles/numExchange; // 换了几瓶咱就喝几瓶
            numBottles = numBottles/numExchange + numBottles%numExchange; // 这次喝完的加上次换剩下的就是现有的酒瓶数了
        }

        return drinkedNumbers;
    }
}

继续做题~CSDN每日一练的Z字形变换,链接如下:

每日一练-做题 每日一练-做题https://dailycode.csdn.net/practice/1798718题目蛮有趣的,老规矩是选择题,充分理解加上注释~代码如下:

package cn.daycode.csdncode;

public class MyConvert {
    public static void main(String[] args) {
        Solution s = new Solution();
        String str = "PAYPALISHIRING";
        int numRows1 = 3;
        int numRows2 = 4;
        System.out.println(s.convert(str, numRows1));
        System.out.println(s.convert(str, numRows2));
    }
}

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) // 要分成一行的情况下,结果就是s本身
            return s;
        int len = s.length(); // len记录了s本身的长度
        if (len <= numRows) // 如果s的长度比要分的行数少,那结果也是s本身
            return s;

        int cycle_len = 2 * numRows - 2; // 分成若干循环,每个循环的字符数量
        int full_cycles = len / cycle_len; // 完整轮次
        int left = len % cycle_len; // 最后余下的小尾巴
        StringBuilder r = new StringBuilder();
        int i;
        // 构造字符串的第一行,也就是前full_cycles个字符
        for (i = 0; i < full_cycles; ++i) {
            r.append(s.charAt(i * cycle_len));
        }
        // 如果存在小尾巴,那第full_cycles+1个字符就是小尾巴的第一个字符
        if (left > 0) {
            r.append(s.charAt(i * cycle_len));
        }
        // 构造字符串的第二~倒数第二行
        for (i = 0; i < numRows - 2; ++i) {
            int j;
            // 构造的第i+2行即是将每轮的第i+2个和倒数i+2个字符依次串起来
            for (j = 0; j < full_cycles; ++j) {
                r.append(s.charAt(j * cycle_len + i + 1));
                r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));
            }
            // 如果存在小尾巴
            if (left > 0) {
                // 把小尾巴的第i+2个元素拼接进去(如果存在)
                if (j * cycle_len + i + 1 < len)
                    r.append(s.charAt(j * cycle_len + i + 1));
                // 把小尾巴的倒数第i+2个元素拼接进去(如果存在)
                if (j * cycle_len + i + 1 + cycle_len - 2 * (i + 1) < len)
                    r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));
            }
        }
        // 构造最后一行
        for (i = 0; i < full_cycles; ++i)
            r.append(s.charAt(i * cycle_len + numRows - 1));
        // 如果小尾巴触底或拐弯了则把小尾巴最下面那个元素也要加入
        if (left >= numRows)
            r.append(s.charAt(i * cycle_len + numRows - 1));
        return r.toString();
    }
}

另外Day0006的不同路径II(【每日一题】Day0006:CSDN每日一练:不同路径 II_AkimotoKaito的博客-CSDN博客)昨晚睡前临时想到出题目的人给的思路似乎可以用递归实现,今早敲了,代码稍后编辑更新补充到上面的文章里~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671359.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号