0
点赞
收藏
分享

微信扫一扫

算法刷题-反转链表 II(链表)、通配符匹配(贪心、递归)、 求输入数字的平均值、最大值(算法初阶、最小值和最大值)

反转链表 II(链表)

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

解答:

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        for (int i = 1; i < m; i++) {
            pre = pre.next;
        }
        head = pre.next;
        for (int i = m; i < n; i++) {
            ListNode nex = head.next;
            head.next = nex.next;
            nex.next = pre.next;
            pre.next = nex;
        }
        return dummy.next;
    }
}

通配符匹配(贪心、递归)

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '' 的通配符匹配。 '?' 可以匹配任何单个字符。'' 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

示例 1:

输入:s = "aa"p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa"p = "*"
输出: true
解释: '*' 可以匹配任意字符串。

示例 3:

输入:s = "cb"p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

示例 4:

输入:s = "adceb"p = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:

输入:s = "acdcb"p = "a*c?b"
输出: false

以下程序实现了这一功能,请你填补空白处内容:

class Solution {
	public boolean isMatch(String s, String p) {
		boolean[][] value = new boolean[p.length() + 1][s.length() + 1];
		value[0][0] = true;
		for (int i = 1; i <= s.length(); i++) {
			value[0][i] = false;
		}
		for (int i = 1; i <= p.length(); i++) {
			if (p.charAt(i - 1) == '*') {
				value[i][0] = value[i - 1][0];
				for (int j = 1; j <= s.length(); j++) {
					value[i][j] = (value[i][j - 1] || value[i - 1][j]);
				}
			} else if (p.charAt(i - 1) == '?') {
				value[i][0] = false;
				for (int j = 1; j <= s.length(); j++) {
					value[i][j] = value[i - 1][j - 1];
				}
			} else {
				value[i][0] = false;
				for (int j = 1; j <= s.length(); j++) {
					____________________;
				}
			}
		}
		return value[p.length()][s.length()];
	}
}

解答:

value[i][j] = s.charAt(j - 1) == p.charAt(i - 1) && value[i - 1][j - 1];

求输入数字的平均值、最大值(算法初阶、最小值和最大值)

输入若干个数,设输入的第一个数n为后面要输入的数的个数,求平均值及最大值,并在屏幕输出来

解答:

import java.util.Scanner;
public class Test{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("输入n:");
        int n=in.nextInt();
        int temp,max=0,sum=0;
        for(int i=0;i<n;i++){
            temp=in.nextInt();
            if (temp>max){
                max=temp;
            }
            sum+=temp;
        }
        System.out.println("最大值为:"+max+",平均值为:"+sum*1.0/n);
    }
}

本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

举报

相关推荐

0 条评论