Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

简介: Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

1. 定义一个类Generator


定义一个类 Generator(生成器类),它可以在每次调用其 next()方法时,产生由你 最喜欢的电影(如 Snow White 或 Star Wars)的字符构成的名字(作为 String 对象)。在字 符列表中的电影名用完之后,循环到这个字符列表的开始处。使用这个生成器来填充数组、 ArrayList、LinkedList、HashSet,然后打印每一个容器。


出处:

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

代码:

import java.util.*;
public class MovieGenerator {
    private String[] movies = new String[] { "SS", "DD", "HH", "FF", "XX", "ZZ" };
    private int i = 0;
    public String next() {
        return movies[i++ % movies.length];
    }
    public String[] getMovies() {
        return movies;
    }
    public Collection<String> fill(Collection<String> collection) {
        for (int i = 0; i < 8; i++) {
            collection.add(next());
        }
        return collection;
    }
    public static void main(String[] args) {
        MovieGenerator generator = new MovieGenerator();
        System.out.println(Arrays.toString(generator.getMovies()));
        System.out.println(generator.fill(new ArrayList<String>()));
        System.out.println(generator.fill(new LinkedList<String>()));
        System.out.println(generator.fill(new HashSet<String>()));
    }
}


输出:


2. 螺旋矩阵 II


给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix


示例 1:

b2086bc4a6e47ebbf922fed2e817b298.jpeg

输入:n = 3

输出:[[1,2,3],[8,9,4],[7,6,5]]


示例 2:

输入:n = 1

输出:[[1]]


提示:

  • 1 <= n <= 20

出处:

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

代码:

import java.util.*;
public class GenerateMatrix {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        if (n == 0) {
            return res;
        }
        int left = 0;
        int right = n - 1;
        int up = 0;
        int down = n - 1;
        int i = 1;
        while (i <= n * n) {
            for (int col = left; col <= right; col++) {
                res[up][col] = i;
                i++;
            }
            up++;
            if (i <= n * n) {
                for (int j = up; j <= down; j++) {
                    res[j][right] = i;
                    i++;
                }
                right--;
            }
            if (i <= n * n) {
                for (int j = right; j >= left; j--) {
                    res[down][j] = i;
                    i++;
                }
                down--;
            }
            if (i <= n * n) {
                for (int j = down; j >= up; j--) {
                    res[j][left] = i;
                    i++;
                }
                left++;
            }
        }
        return res;
    }
    public static void main(String[] args) {
        GenerateMatrix a = new GenerateMatrix();
        System.out.println(Arrays.deepToString(a.generateMatrix(3)));
    }
}

输出:

[[1, 2, 3], [8, 9, 4], [7, 6, 5]]


3. 删除排序链表中的重复元素 II


存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。


返回同样按升序排列的结果链表。


示例 1:

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

输出:[1,2,5]


示例 2:

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

输出:[2,3]


提示:

   链表中节点数目在范围 [0, 300] 内

   -100 <= Node.val <= 100

   题目数据保证链表已经按升序排列


出处:

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

代码:

import java.util.*;
public class deleteDuplicates {
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }
    public static class Solution {
        public ListNode deleteDuplicates(ListNode head) {
            if (head == null || head.next == null) {
                return head;
            }
            ListNode next = head.next;
            if (head.val == next.val) {
                while (next != null && head.val == next.val) {
                    next = next.next;
                }
                head = deleteDuplicates(next);
            } else {
                head.next = deleteDuplicates(next);
            }
            return head;
        }
    }
    public static ListNode createLinkedList(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }
        ListNode head = new ListNode(nums[0]);
        ListNode cur = head;
        for (int i = 1; i < nums.length; i++) {
            cur.next = new ListNode(nums[i]);
            cur = cur.next;
        }
        return head;
    }
    public static void printLinkedList(ListNode head) {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + "->");
            cur = cur.next;
        }
        System.out.println("null");
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {1,2,3,3,4,4,5};
        ListNode head = createLinkedList(nums);
        printLinkedList(head);
        head = s.deleteDuplicates(head);
        printLinkedList(head);
        int[] nums2 = {1,1,1,2,3};
        head = createLinkedList(nums2);
        printLinkedList(head);
        head = s.deleteDuplicates(head);
        printLinkedList(head);
    }
}

输出:

1->2->3->3->4->4->5->null

1->2->5->null

1->1->1->2->3->null

2->3->null

目录
相关文章
|
17天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
41 17
|
7天前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
15 4
|
9天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
14天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
13天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
54 4
|
13天前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
21 1
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
18天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
22天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
22天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。