小工具知识网

当前位置: 首页 > 行业知识 > 力扣242、349、202、1、24、19、160、142-java刷题笔记

行业知识

力扣242、349、202、1、24、19、160、142-java刷题笔记

2026-10-19 00:34:43 来源:互联网转载

  一、242. 有效的字母异位词

��1.1题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"输出: true

示例 2:

输入: s = "rat", t = "car"输出: false

1.2思路分析

方法1:传统方法

将字符串转换为字符数组,然后分别对两个数组进行排序,然后在调用equals方法进行比较;

方法2:哈希表

因为题目的需求是找"是否存在"的问题,因此可以考虑使用哈希表,对两个字符串中的字符作为数组的下表,其出现的频次作为数组的值,然后根据出现的频次就可以判断两个字符串是否相等。

1.3代码实现

 方法1暴力求解

class Solution {    public boolean isAnagram(String s, String t) {        // 注意字符串数组在获取数组长度时调用length()        int length1 = s.length();        int length2 = t.length();        if(length1 != length2){            return false;        }        // 调用toCharArray()方法将字符串转换为字符数组        char[] s1 = s.toCharArray();        char[] s2 = t.toCharArray();        // 调用Array.sort()方法对数组进行排序        Arrays.sort(s1);        Arrays.sort(s2);        // 使用Arrays.equals()方法对数组中的值进行比较        return  Arrays.equals(s1,s2);    }}


方法2哈希表

class Solution {    public boolean isAnagram(String s, String t) {        // 使用哈希表对字符串中的每个字符出现的频次进行统计        // 定义一个新数组        if (s.length() != t.length()) {            return false;        }        // 因为result中每个值存的是对应的字符出现的频次因此,其长度定义为26        int[] result = new int[26];        // 对字符串中的字符出现的频次进行统计        for (int i = 0; i  

二、349. 两个数组的交集

 2.1题目

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]解释:[4,9] 也是可通过的

 2.2思路分析

该题也可以转化为是否存在问题,即当两个数组中存在相同值时,此时则可以理解为两个数组存在交集;但是输出中要求不能出现冗余,因此考虑使用HashSet。

2.3代码实现

首先判断这两个数组中是否有值,若没有值,直接返回一个空数组,然后定义两个集合,一个用于存放待判断的数组,另一个存放最后的结果,最后再将集合转化为数组返回。

class Solution {    public int[] intersection(int[] nums1, int[] nums2) {        // 判断nums1与nums2中是否有值        if(nums1.length == 0 ||nums2.length== 0 || nums2 ==null ||nums1 == null){            return new int[0];        }        // 因为数组中有重复的值,因此我们使用 HashSet对数组去重       HashSet  set1 =  new HashSet();    //    定义一个结果hashset       HashSet result = new HashSet();       for(int i:nums1){        //    将nums1中的数值添加到set1中并去重           set1.add(i);       }       for(int i:nums2){           if(set1.contains(i)){               result.add(i);           }       }    //    int [] arr = new int[result.]    return result.stream().mapToInt(x->x).toArray();    }}

三、202. 快乐数

3.1题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

    如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

    示例 1:

    输入:n = 19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1

    示例 2:

    输入:n = 2输出:false

    3.2思路分析

    该题的难点在于如何判断是否进入***循环,那么什么时候迭代过程会进入***循环呢,即当当前的数值在以往的迭代过程中出现过,因此该题同样可以考虑使用HashSet。

    3.3代码实现

    首先定义一个求和的函数;然后再根据条件迭代即可,注意:(n % 10)*(n % 10)取模的平方时需要对其带括号。

    class Solution {    public boolean isHappy(int n) {        // 先判断该数是不是1,若是1则直接返回        if(n == 1){            return true;        }        // 需要判断该数是否为无限循环即存在过问题,因此可以定义一个哈希表        // 返回值是无须的因此可以使用unordered_set set(c++) 或直接使用set         HashSet set1 =new HashSet ();        //循环的条件为 判断值是否存在于hashset中且 n !=1        while(n != 1 && !set1.contains(n)){            set1.add(n);            n = addsum(n);        }        return n == 1;    }    // 对n的各个位置进行平方求和    public int addsum(int n){        int temp = 0;        while(n > 0){            // int res = n % 10;            temp += (n % 10)*(n % 10);            n = n/10;        }    return temp;    }}

       四、1. 两数之和

     4.1题目

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

    你可以按任意顺序返回答案。

    示例 1:

    输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

    示例 2:

    输入:nums = [3,2,4], target = 6输出:[1,2]

    示例 3:

    输入:nums = [3,3], target = 6输出:[0,1]

    4.2思路分析

    方法1:暴力求解

    使用两次for循环来遍历求解

    方法2:哈希表

    我们可以将题目转化为寻找target-nums[1]的值是否在nums中存在的问题,又因为题目最后的返回值需要满足条件的下标,因此可以考虑使用HashMap,我们将数组中的值作为HashMap中的key,值的下标作为HashMap中的value。

    4.3代码实现

     方法1暴力求解

    class Solution {    public int[] twoSum(int[] nums, int target) {        int temp = 0;        // int [] k = new int[2] ;        for(int i = 0; i0){            cur1 = cur1.next;            gap--;        }        while(cur1!=null && cur2 != null){            if(cur1 == cur2){                return cur1;            }            cur1 = cur1.next;            cur2 = cur2.next;        }      return null;    }}

    八、142. 环形链表 II

     8.1题目

    给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

    不允许修改 链表。

    示例 1:

    输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。

    示例 2:

    输入:head = [1,2], pos = 0输出:返回索引为 0 的链表节点解释:链表中有一个环,其尾部连接到第一个节点。

    示例 3:

    输入:head = [1], pos = -1输出:返回 null解释:链表中没有环。

     8.2思路分析

    第一步:判断链表中是否有环

    定义快慢指针,让快指针以比慢指针快2倍的速度移动,若快指针可以和慢指针相遇则证明该链表有环。

    第二步:找到初始相遇的节点。

    假设头节点到初始相遇节点的长度为x,环入口节点到相遇节点的长度为y,相遇节点到换入口的长度为z。

    则我们根据快慢指针的移动速度可以列入下表达式:;

    进一步化简得;

    而,我们取个极限情况,即n=1时,此时。

    因此我们可以进一步定义两个指针,一个指针由头指针开始向后运动,另一个指针由相遇位置开始移动,当两个新定义得指针再次相遇时,此时得相遇点则为快慢指针得初始相遇点。

    8.3代码实现

    /** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode detectCycle(ListNode head) {        // 使用快慢指针,快指针以2倍速的方式取去追赶慢指针,当快指针等于慢指针时        // 说明此时有环        ListNode fast = head;        ListNode slow = head;        // 因为快指针一次走两步因此需要判断fast.next是否为空,若不为空则继续循环        while(fast != null && fast.next != null){            slow = slow.next;            fast = fast.next.next;            if(slow == fast){              ListNode index1 = head;              ListNode index2 = fast;              while(index1 != index2){                  index1 = index1.next;                  index2 = index2.next;              }              return index1;          }        }       return null;     }}

上一篇:电脑里怎么进去服务器界面?

下一篇:Win10故障解析与解决宝典