1、(Z字型变换):
这段代码是解决“Z字型变换”问题。它提供了一个Java类Solution
,其中包含一个方法convert
,该方法接收一个字符串s
和一个整数numRows
。任务是将字符串s
按照给定的行数numRows
,以从上到下、从左到右的顺序进行Z字型排列。
代码中首先检查特殊情况:如果numRows
为1或者numRows
大于等于字符串s
的长度,则直接返回原始字符串,因为不需要变换。
然后,代码创建了一个ArrayList
来存储每一行的结果,并初始化一个index
变量来记录当前字符应该添加到哪一行。使用一个标志变量flag
来控制index
的移动方向,因为Z字型的行在第一行和最后一行时方向会反转。
通过遍历字符串s
中的每个字符,将其添加到当前行,并根据当前行的位置更新flag
的值来决定是向上移动还是向下移动。最后,将所有行的结果拼接起来形成最终的Z字型字符串。
2、(盛水最多的容器):
这段代码是解决“盛水最多的容器”问题。它提供了一个Java类Solution
,其中包含一个方法maxArea
,该方法接收一个整数数组height
。任务是计算由这些高度形成的容器可以储存的最大水量。
代码中使用双指针技术,初始化两个指针left
和right
分别指向数组的开始和结束。通过不断移动较小边的指针,来计算当前容器的面积,并更新最大面积ans
。
面积由两边的高度中的较小值和两边的距离决定。当较小边的指针移动后,如果新的边的高度小于等于之前计算的最小高度,则继续移动,因为这样可以得到更大的面积。
通过这种方式,代码不断更新最大面积,并最终返回计算得到的最大水量。
package Code6;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @description Z字型变换
* @level 中等
* @url <a href="https://leetcode.cn/problems/zigzag-conversion/description/">url</a>
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
class Solution {
/**
* 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
*
* @param s
* @param numRows
* @return java.lang.String
*/
public String convert(String s, int numRows) {
//如果只有一行或者一列
if (numRows == 1 || numRows >= s.length()) return s;
//按行添加,最后从第一行拼接到最后一行
List<StringBuilder> rows = new ArrayList<>(numRows);
//初始化每行
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
//标志当前字符应该添加到哪一行,默认从第一行开始
int index = 0;
//控制index上下移动,默认向下即+1 但第一行和最后一行要反转方向,故初始化为-1
int flag = -1;
//遍历字符串
for (char c : s.toCharArray()) {
//添加到第i行
rows.get(index).append(c);
//如果是最后一行或者第一行,则反转方向
if (index == 0 || index == numRows - 1) {
flag = -flag;
}
//更新index
index += flag;
}
//把每一行的数据拼接
StringBuilder ans = new StringBuilder();
for (StringBuilder row : rows) {
ans.append(row);
}
return ans.toString();
}
}
package Code11;
import java.util.Scanner;
/**
* @description 盛水最多的容器
* @level 中等
* @url <a href="https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=top-100-liked">url</a>
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
class Solution {
/**
* 返回容器可以储存的最大水量。
*
* @param height
* @return int
*/
public int maxArea(int[] height) {
//双指针:遍历所有能作为容器左右边界的边,每次移动较小的边
int left = 0;
int right = height.length - 1;
//题解:最大水量
int ans = 0;
while (left < right) {
//面积由最短边 * 宽度决定
int minHeight = Math.min(height[left], height[right]);
//更新最大水
ans = Math.max(ans, minHeight * (right - left));
//移动短的那条边:宽度已经一定变小,如果新的高度小于等于短边,则一定更小
while (left < right && height[left] <= minHeight) left++;
while (left < right && height[right] <= minHeight) right--;
}
return ans;
}
}