【2022.12.16】备战春招Day11——每日一题 + 142. 环形链表 II + 93. 复原 IP 地址

【每日一题】 1785. 构成特定和需要添加的最少元素
题目描述

给你一个整数数组 nums ,和两个整数 limit 与 goal 。数组 nums 有一条重要属性:abs(nums[i]) <= limit 。
返回使数组元素总和等于 goal 所需要向数组中添加的最少元素数量 ,添加元素 不应改变 数组中 abs(nums[i]) <= limit 这一属性。

输入:nums = [1,-1,1], limit = 3, goal = -4
输出:2
解释:可以将 -2 和 -3 添加到数组中,数组的元素总和变为 1 - 1 + 1 - 2 - 3 = -4 。

题目解析

【贪心】:每次添加的数,都是最大的数,可以保证添加的数量最少。

class Solution {
    public int minElements(int[] nums, int limit, int goal) {
        //计算目前nums总和 long!
        long sum = 0;
        for (int x : nums) {
            sum += x;
        }
        //计算差值:long
        long diff = Math.abs(goal - sum);
        //贪心算法 每次都补充 最大的 数
        // 向上取整!
       return (int) ((diff + limit - 1) / limit);

    }
}
【leetcode hot 100】142. 环形链表 II
题目描述

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

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

题目解析

【判断是否有环】:使用快慢指针,fast指针每次走两步,slow指针每次走一步。如果两者可以相遇,则说明有环。
【判断相交点】:分别从头节点、慢指针开始,向后遍历,相遇点为相交点。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        //判断是否有环
        if(head == null) return null;
        ListNode fast = head, slow = head;
        while(true){
            if((fast == null || fast.next == null)) return null;
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) break;
        }
        ListNode cur = head;
        while(cur != slow){
            cur = cur.next;
            slow = slow.next;
        }
        return cur;
    }
}
【代码随想录】93. 复原 IP 地址
题目描述

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]

题目解析
class Solution {
    List<String> res = new ArrayList<>();
    StringBuffer element = new StringBuffer();
    public List<String> restoreIpAddresses(String s) {
        if(s.length() > 12 && s.length() < 4) return res;
        dfs(s, 0, 0);
        return res;
    }

    public void dfs(String s, int index, int num){
        if(num == 4){
            if(index == s.length()){
                res.add(element.toString());
            }
            return;
        }

        String sb = "";
        for(int i = index; i < Math.min(s.length(), index + 3); i++){
            sb += s.charAt(i);
            int temp = Integer.parseInt(sb);
            int point = 0;
            if(temp <= 255 && s.length() - i <= 10){
                element.append(sb);
                if(num < 3){
                    element.append(".");
                    point += 1;
                }
                dfs(s, i + 1, num + 1);
                element.delete(element.length() - sb.length() - point, element.length());
            }
            if(temp == 0) break;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值