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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环形链表(哈希表链表)寻找两个正序数组的中位数(数组二分查找)二进制求和(位运算数学)相关的知识,希望对你有一定的参考价值。

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

给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 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();
    

以上是关于环形链表(哈希表链表)寻找两个正序数组的中位数(数组二分查找)二进制求和(位运算数学)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)

Leetcode4. 寻找两个正序数组的中位数(二分)

4.寻找两个正序数组的中位数

Leetcode 4. 寻找两个正序数组的中位数-困难(带图)

Hard | LeetCode 4. 寻找两个正序数组的中位数 | 二分法

寻找两个正序数组的中位数