首页 > 其他分享 >环形链表(哈希表、链表)、寻找两个正序数组的中位数(数组、二分查找)、二进制求和(位运算、数学)

环形链表(哈希表、链表)、寻找两个正序数组的中位数(数组、二分查找)、二进制求和(位运算、数学)

时间:2023-03-08 14:31:51浏览次数:44  
标签:正序 int s1 链表 length 数组 nums1 nums2

环形链表(哈希表、链表)

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

进阶: 你能用 O(1)(即,常量)内存解决此问题吗?

示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引

解答:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null)
            return false;
        ListNode fast = head.next;
        ListNode slow = head;
        while (fast != slow) {
            if (fast.next == null || fast.next.next == null)
                return false;
            fast = fast.next.next;
            slow = slow.next;
        }
        return true;
    }
}

寻找两个正序数组的中位数(数组、二分查找)

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

示例 4:

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

示例 5:

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

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

**进阶:**你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗? 以下程序实现了这一功能,请你填补空白处内容:

class Solution {
	public double findMedianSortedArrays(int[] nums1, int[] nums2) {
		int nums1Size = nums1.length;
		int nums2Size = nums2.length;
		int na = nums1Size + nums2Size;
		int[] ns = new int[4 * na];
		int i = 0, j = 0, d = 0;
		int m = na / 2 + 1;
		while (d < m) {
			int n = 0;
			_________________;
			ns[d++] = n;
		}
		if (na % 2 == 1) {
			return ns[d - 1];
		}
		return (ns[d - 1] + ns[d - 2]) / 2.0;
	}
}

解答:

if (i < nums1Size && j < nums2Size) {
	n = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++];
} else if (i < nums1Size) {
	n = nums1[i++];
} else if (j < nums2Size) {
	n = nums2[j++];
}

二进制求和(位运算、数学)

给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 **非空 **字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

提示:

  • 每个字符串仅由字符 '0' 或 '1' 组成。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 "0" ,就都不含前导零。

解答:

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer s1 = new StringBuffer(a);
        s1.reverse();
        StringBuffer s2 = new StringBuffer(b);
        s2.reverse();
        if (s1.length() > s2.length()) {
            int n = s1.length() - s2.length();
            for (int i = 0; i < n; i++) {
                s2.append('0');
            }
        } else if (s1.length() < s2.length()) {
            int n = s2.length() - s1.length();
            for (int i = 0; i < n; i++) {
                s1.append('0');
            }
        }
        StringBuffer stringBuffer = new StringBuffer("");
        int i = 0;
        char flag = '0';
        while (i < s1.length() && i < s2.length()) {
            if (flag == '0') {
                if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
                    flag = '1';
                    stringBuffer.append('0');
                } else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0') {
                    stringBuffer.append('0');
                } else {
                    stringBuffer.append('1');
                }
            } else {
                if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
                    flag = '1';
                    stringBuffer.append('1');
                } else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0') {
                    flag = '0';
                    stringBuffer.append('1');
                } else {
                    flag = '1';
                    stringBuffer.append('0');
                }
            }
            i++;
        }
        if (flag == '1') {
            stringBuffer.append(flag);
        }
        stringBuffer.reverse();
        return stringBuffer.toString();
    }
}

本文内容到此结束了, 如有收获欢迎点赞

标签:正序,int,s1,链表,length,数组,nums1,nums2
From: https://blog.51cto.com/zhanjq/6107485

相关文章

  • 【数组】LeetCode 剑指 Offer 04. 二维数组中的查找
    题目链接剑指Offer04.二维数组中的查找思路借鉴Krahets大神的思路,将矩阵逆时针旋转45°,可以发现其大小性质类似于二叉搜索树。利用这个性质可以很方便的在搜索过程......
  • 【哈希表】LeetCode 剑指 Offer 03. 数组中重复的数字
    题目链接剑指Offer03.数组中重复的数字思路使用哈希表记录每个数字的出现次数。代码classSolution{publicintfindRepeatNumber(int[]nums){in......
  • 26. 删除有序数组中的重复项
    https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 26.删除有序数组中的重复项难度简单3051收藏分享切换为英文接收动态反馈给你一个 升序......
  • 剑指 Offer 24. 反转链表
    https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例:输入:1->2->3->4->5->NULL......
  • 双向链表
    双向链表可以实现自我删除,和向前向后查找,因为双向链表中多了个pre,而pre是指向前一个节点单向链表删除只能单一查找,并且如果删除需要定位到要删除节点的前一个节点具体:......
  • java 数组 -创建和添加 (增删改查)25
     创建: packagecom.demo.Array;importjava.util.ArrayList;publicclassday01{/*Arraylist集合的使用细节:创建String,Stringbuilder,A......
  • 【双指针】LeetCode 88. 合并两个有序数组
    题目链接88.合并两个有序数组思路看到题目的第一感觉就是用双指针进行原地合并,但是nums1的元素都在数组头部,如果正序合并的话非常容易破坏nums1的结构。nums1在......
  • 【数组】LeetCode 264. 丑数 II
    题目链接264.丑数II思路根据题目中的样例,可以进行拆分\[1,1×2,1×3,2×2,1×5,2×3,2×4,3×3,3×4,3×5\]观察能发现,这些多项式能分成下面三组:\[乘2:......
  • 数组-leetcode-485
    ​​0️⃣python数据结构与算法学习路线​​学习内容:基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…数据结构:字符串(string)、列表(list)、元......
  • 数组-Leetcode-697
    ​​0️⃣python数据结构与算法学习路线​​学习内容:基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…数据结构:字符串(string)、列表(list)、元......