Java每日一练(20230312)

Posted Hann Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java每日一练(20230312)相关的知识,希望对你有一定的参考价值。

目录

1. 两数之和 II  ★

2. 反转链表  ★★

3. 二叉树的层序遍历 II  ★★★

🌟 每日一练刷题专栏

C/C++ 每日一练 ​专栏

Python 每日一练 专栏

Java 每日一练 专栏


1. 两数之和 II

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

示例 2:

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

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]

提示:

  • 2 <= numbers.length <= 3 * 10^4
  • -1000 <= numbers[i] <= 1000
  • numbers 按 非递减顺序 排列
  • -1000 <= target <= 1000
  • 仅存在一个有效答案

代码:

class Solution 
    public int[] twoSum(int[] numbers, int target) 
        int[] answer = new int[2];
        int n = numbers.length;
        for (int i = 0; i < n - 1; i++) 
            int t = target - numbers[i];
            answer[0] = i + 1;
            for (int j = i + 1; j < n; j++) 
                if (numbers[j] > t) 
                    break;
                
                if (numbers[j] == t) 
                    answer[1] = j + 1;
                    break;
                
            
            if (answer[1] != 0) 
                break;
            
        
        return answer;
    

2. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

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

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

代码:

public class ListNode 
    int val;
    ListNode next;
    ListNode(int x) 
        val = x;
    

class Solution 
    public ListNode reverseList(ListNode head) 
        ListNode pre = null;
        while (head != null) 
            ListNode tmp = head.next;
            head.next = pre;
            pre = head;
            head = tmp;
        
        return pre;
    

3. 二叉树的层序遍历 II

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:给定二叉树 [3,9,20,null,null,15,7],

     3
    / \\
   9  20
     /  \\
    15   7

返回其自底向上的层序遍历为:

[
[15,7],
[9,20],
[3]
]

代码:

public class TreeNode 
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) 
        val = x;
    

class Solution 
    public List<List<Integer>> levelOrderBottom(TreeNode root) 
        List<List<Integer>> list1 = new ArrayList<>();
        if (root == null)
            return list1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) 
            List<Integer> list2 = new ArrayList<>();
            int count = queue.size();
            for (int i = 0; i < count; i++) 
                TreeNode node = queue.poll();
                list2.add(node.val);
                if (node.left != null)
                    queue.add(node.left);
                if (node.right != null)
                    queue.add(node.right);
            
            list1.add(0, list2);
        
        return list1;
    

附录

DFS 深度优先搜索算法

Depth-First-Search,是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

BFS 广度优先搜索算法

Breadth-First Search,又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

BFS 和 DFS 的区别

1 数据结构

bfs 遍历节点是先进先出,一般使用队列作为辅助数据结构
dfs遍历节点是先进后出,一般使用栈作为辅助数据结构

2 访问节点的方式

bfs是按层次访问的,先访问源点,再访问它的所有相邻节点,并且标记结点已访问,根据每个邻居结点的访问顺序,依次访问它们的邻居结点,并且标记节点已访问,重复这个过程,一直访问到目标节点或无未访问的节点为止。
dfs 是按照一个路径一直访问到底,当前节点没有未访问的邻居节点时,然后回溯到上一个节点,不断的尝试,直到访问到目标节点或所有节点都已访问。

3 应用

bfs 适用于求源点与目标节点距离近的情况,例如:求最短路径。
dfs 更适合于求解一个任意符合方案中的一个或者遍历所有情况,例如:全排列、拓扑排序、求到达某一点的任意一条路径。 


🌟 每日一练刷题专栏

 持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

 评论,你的意见是我进步的财富!  

​​

C/C++ 每日一练 ​专栏

​​​

Python 每日一练 专栏

Java 每日一练 专栏

Java每日一练(20230331)

目录

1. 最长公共前缀  🌟

2. 改写字符串  🌟

3. 不同的二叉搜索树 II  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 0 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

出处:

https://edu.csdn.net/practice/24313068

代码:

class longestCommonPrefix 
    public static class Solution 
        public String longestCommonPrefix(String[] strs) 
            if (strs.length == 0) 
                return "";
            
            int i = 0;
            StringBuilder lcp = new StringBuilder();
            while (true) 
                boolean done = false;
                if (i >= strs[0].length()) 
                    break;
                
                for (int j = 0; j < strs.length; j++) 
                    if (i < strs[j].length()) 
                        if (strs[j].charAt(i) != strs[0].charAt(i)) 
                            done = true;
                            break;
                        
                     else 
                        done = true;
                        break;
                    
                
                if (done) 
                    break;
                 else 
                    lcp.append(strs[0].charAt(i));
                    i++;
                
            
            return lcp.toString();
        
    
    public static void main(String[] args) 
        Solution s = new Solution();
        String[] nums = "flower","flow","flight";
        System.out.println(s.longestCommonPrefix(nums));
   

输出:

fl

其它写法:

public String longestCommonPrefix(String[] strs)
    if (strs == null || strs.length == 0)
        return "";
   
    int minLen = Integer.MAX_VALUE;
    for (String str : strs)
        minLen = Math.min(minLen, str.length());
   
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < minLen; i++)
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j++)
            if (strs[j].charAt(i) != c)
                return sb.toString();
           
       
        sb.append(c);
   
    return sb.toString();


2. 改写字符串

键盘录入一个字符串,将字符串中的大写改成小写,小写改成大写,数字改成

例如heLLO123,输出后为HEllo**。

出处:

https://edu.csdn.net/practice/24313069

代码:

import java.util.Scanner;
public class Transfer 
    public static void main(String[] args) 
    String str = "";
    Scanner s = new Scanner(System.in);
    System.out.println("请输入您想输入的字符串:");
    str = s.next();
    StringBuffer sb = new StringBuffer();
    int i;
    for (i = 0; i <= str.length() - 1; i++) 
        char ch;
        if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') 
            ch = (char) (str.charAt(i) - 32); 
         else if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') 
            ch = (char) (str.charAt(i) + 32); 
         else if (str.charAt(i) >= '0' && str.charAt(i) <= '9') 
            ch = '*'; 
         else 
            ch = str.charAt(i); 
        
        sb.append(ch); 
    
    String trStr = sb.toString(); 
    System.out.println(sb.toString());
  

输出:


3. 不同的二叉搜索树 II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 8

出处:

https://edu.csdn.net/practice/24313070

代码:

class TreeNode 
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) 
        val = x;
    

class Solution 
    public List<TreeNode> generateTrees(int n) 
        if (n == 0)
            return new LinkedList<TreeNode>();
        return generate_trees(1, n);
    
    private LinkedList<TreeNode> generate_trees(int start, int end) 
        LinkedList<TreeNode> all_trees = new LinkedList<TreeNode>();
        if (start > end) 
            all_trees.add(null);
            return all_trees;
        
        for (int i = start; i <= end; i++) 
            LinkedList<TreeNode> left_trees = generate_trees(start, i - 1);
            LinkedList<TreeNode> right_trees = generate_trees(i + 1, end);
            for (TreeNode l : left_trees)
                for (TreeNode r : right_trees) 
                    TreeNode current_tree = new TreeNode(i);
                    current_tree.left = l;
                    current_tree.right = r;
                    all_trees.add(current_tree);
                
        
        return all_trees;
    

输出:


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

以上是关于Java每日一练(20230312)的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥Java每日一练————3.合并两个有序链表

Java每日一练(20230403)

Golang每日一练(leetDay0021)

C/C++每日一练(20230405)

Java每日一练(20230331)

「 每日一练,快乐水题 」141. 环形链表