leetcode算法题解(Java版)-6-链表,字符串
发布日期:2025-04-05 04:31:23 浏览次数:8 分类:精选文章

本文共 2418 字,大约阅读时间需要 8 分钟。

一、字符串处理

题目描述

将一个整数转换为罗马数字。输入数字保证在1到3999范围内。

思路

根据罗马数字的规律,可以通过创建一个映射表来存储各个位置对应的罗马字符。然后将这个数分解为千位、百位、十位和个位,逐步构建结果字符串。注意处理特定情况,如4、9、40、90和400的特殊写法。

代码

public class Solution {    public String intToRoman(int num) {        String[][] map = {            {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},            {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},            {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},            {"", "M", "MM", "MMM"}        };        StringBuffer sb = new StringBuffer();        int thousand = num / 1000;        int hundred = num / 100 % 10;        int ten = num / 10 % 10;        int one = num % 10;        sb.append(map[3][thousand]);        sb.append(map[2][hundred]);        sb.append(map[1][ten]);        sb.append(map[0][one]);        return sb.toString();    }}

二、链表操作

题目描述

给定两个链表,分别表示两个非负数,将它们相加并返回结果链表。

思路

链表的相加需要从右到左逐位相加,并处理进位。虽然链表题可能需要处理右侧到左侧的节点,但我们可以从头节点开始处理。创建一个新的头节点,逐步构建结果链表。注意节点的顺序和进位处理。

代码

public class Solution {    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {        if (l1 == null) {            return l2;        }        if (l2 == null) {            return l1;        }        ListNode head = new ListNode(0);        ListNode p = head;        int tem = 0;        while (l1 != null || l2 != null || tem != 0) {            if (l1 != null) {                tem += l1.val;                l1 = l1.next;            }            if (l2 != null) {                tem += l2.val;                l2 = l2.next;            }            p.next = new ListNode(tem % 10);            p = p.next;            tem /= 10;        }        return head.next;    }}

三、最长无重复字符子串

题目描述

给定一个字符串,找到最长的没有重复字符的子串长度。

思路

使用滑动窗口法,从左到右遍历字符串,维护一个窗口,同时记录字符的位置。遇到重复字符时,调整左窗口边界。最后返回最长窗口长度。

代码

import java.util.HashMap;public class Solution {    public int lengthOfLongestSubstring(String s) {        HashMap
map = new HashMap<>(); int len = s.length(); if (len == 0) { return 0; } int maxLen = 0; int left = 0; for (int right = 0; right < len; right++) { char c = s.charAt(right); if (map.containsKey(c)) { left = Math.max(left, map.get(c) + 1); } map.put(c, right); maxLen = Math.max(maxLen, right - left + 1); } return maxLen; }}

通过这三个题目,我学会了如何处理不同数据结构的问题,并掌握了解决复杂问题的方法和技巧。这些问题让我变得更加熟练和自信,准备遇下更多挑战!

上一篇:LeetCode经典——202.快慢指针之快乐数
下一篇:leetcode第40题:组合总和II

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月16日 23时44分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章