华为OD刷题C卷 - 每日刷题 3

73 篇文章 0 订阅
37 篇文章 1 订阅

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。任务是计算由这些高度形成的容器可以储存的最大水量。

代码中使用双指针技术,初始化两个指针leftright分别指向数组的开始和结束。通过不断移动较小边的指针,来计算当前容器的面积,并更新最大面积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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值