今天题目似乎都简单不少于是多做了几题。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博客)昨晚睡前临时想到出题目的人给的思路似乎可以用递归实现,今早敲了,代码稍后编辑更新补充到上面的文章里~



