算法小知识-----8.06-----软柿子盛宴

102 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

适逢周六,虽是休息日,题感不能放下

数组中的字符串匹配

该题出自力扣的1408题 —— 数组中的字符串匹配【简单题】,也是今天每日一题

审题

给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。

  • 题意并不复杂,就是给出一个字符串数组,要求返回一个列表是子字符串
  • 首当其冲的便是想到冒泡算法
    • 两个for循环
    • 利用String的contain方法,判断是否为子字符串
    • 因为是双重for循环,并且搭配长度的校验作为剪枝,所以可以实现list的查重

编码

class Solution {
    public List<String> stringMatching(String[] words) {
        List<String> list = new ArrayList<>();
        for (String a:words) {
            for (int i = 0; i < words.length; i++) {
                if (a.length() >= words[i].length())continue;
                if (words[i].contains(a)){
                    list.add(a);
                    break;
                }
            }
        }
        return list;
    }
}

1659768784908.png

链表随即节点

该题出自力扣的382题 ——链表的随机节点【中等题】

审题

给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。
实现 Solution 类:

  • Solution(ListNode head) 使用整数数组初始化对象。
  • int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
  • 该题题意不难,需要返回一个链表的随机节点里面的值
  • 提供了两个方法
    • 初始化方法
      • 初始化Random方法,作为随机的支撑
      • 定义一个列表,存储链表
      • 循环链表,依次存入列表中
    • 返回随机值的方法
      • 利用列表的长度,选出随机下标
      • 利用选出的随机下标,找到对应的链表节点,并返回对应的值

编码

class Solution {
    Random random;
    List<ListNode> listNodes = new ArrayList<>();
    public Solution(ListNode head) {
        random = new Random();
        while (head != null){
            listNodes.add(head);
            head = head.next;
        }
    }

    public int getRandom() {
        int i = random.nextInt(listNodes.size());
        return listNodes.get(i).val;
    }
}

image.png