[七日打卡]之第十二卡:环形链表、两数之和II、Excle表列名

174 阅读1分钟

环形链表

思路:

哈希表

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        HashSet<ListNode> set = new HashSet<ListNode>();

        while (head != null) {
            if (!set.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}

两数之和II

思路:

之前的两数之和使用hash表的算法,不过这种算法适合无序数组,对于有序数组,可以使用双指针或者二分查找。

对于有序数组,推荐使用双指针,A指针从前向后,B指针从后向前,如果两数之和比目标值大,B指针前移,如果两数之和比目标值小,A指针向后。

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int left = 0;
        int right = numbers.length - 1;

        while (left < right) {
            if (numbers[left] + numbers[right] < target) {
                left++;
            } else if (numbers[left] + numbers[right] > target) {
                right--;
            } else {
                return new int[]{left + 1, right + 1};
            }
        }
        return new int[]{-1, -1};
    }
}

Excle表列名

思路:

可以认为是26进制,但是,对于普通的二进制、八进制、十六进制等计算方式,低位是右0的,在这道题中,没有0,如果使用%计算出来是0,结果则为‘Z’,上一位也需要减去1。

class Solution {
    public String convertToTitle(int n) {
        StringBuffer sb = new StringBuffer();
        while (n > 0) {
            if (n % 26 == 0) {
                sb.append('Z');
                n -= 1;
            } else {
                sb.append((char) ((n % 26) + 'A' - 1));
            }
            n = n / 26;
        }
        return sb.reverse().toString();
    }
}

今天到这里吧~~~