两数之和Ⅱ-输入有序数组 力扣
题目描述 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
1 2 3 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public int [] twoSum(int [] numbers, int target) { if (numbers == null ) return null ; int min = 0 ,max = numbers.length - 1 ; while (min < max){ int rel = numbers[min] + numbers[max]; if (rel == target) return new int []{min + 1 ,max + 1 }; else if (rel < target) min += 1 ; else max -= 1 ; } return null ; } }
平方数之和 力扣
题目描述 给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c。
示例1:
1 2 3 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5
示例2:
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public boolean judgeSquareSum (int c) { int min = 0 ,max = (int ) Math.sqrt(c); while (min <= max){ int sum = min * min + max * max; if (sum == c){ return true ; } else if (sum < c){ min += 1 ; } else { max -= 1 ; } } return false ; } }
反转字符串中的元音字母 力扣
题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
示例 2:
1 2 输入:"leetcode" 输出:"leotcede"
提示:
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution { private final static HashSet<Character> vowels = new HashSet<>( Arrays.asList('a' , 'e' , 'i' , 'o' , 'u' , 'A' , 'E' , 'I' , 'O' , 'U' )); public String reverseVowels (String s) { if (s == null ) return null ; int i = 0 , j = s.length() - 1 ; char [] result = new char [s.length()]; while (i <= j) { char ci = s.charAt(i); char cj = s.charAt(j); if (!vowels.contains(ci)) { result[i++] = ci; } else if (!vowels.contains(cj)) { result[j--] = cj; } else { result[i++] = cj; result[j--] = ci; } } return new String(result); } }
验证回文字符串Ⅱ 力扣
题目描述 给定一个非空字符串 s
,最多 删除一个字符。判断是否能成为回文字符串。
示例 1:
示例 2:
1 2 3 输入: "abca" 输出: True 解释: 你可以删除c字符。
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public boolean validPalindrome (String s) { for (int i = 0 ,j = s.length() - 1 ;i < j; i++,j--){ if (s.charAt(i) != s.charAt(j)){ return isPalidrome(s,i+1 ,j) || isPalidrome(s,i,j-1 ); } } return true ; } private boolean isPalidrome (String s, int i,int j) { while (i<j){ if (s.charAt(i++) != s.charAt(j--)) { return false ; } } return true ; } }
合并两个有序数组 力扣
题目描述 给你两个有序整数数组 nums1 和 nums2 ,请你将 nums2 合并到 nums1 中, 使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
1 2 3 4 5 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Solution { public void merge (int [] nums1, int m, int [] nums2, int n) { int i = m - 1 ,j = n - 1 , k = m + n - 1 ; while (i >= 0 || j >= 0 ){ if (i < 0 ){ nums1[k--] = nums2[j--]; } else if (j < 0 ){ nums1[k--] = nums1[i--]; } else if (nums1[i] > nums2[j]){ nums1[k--] = nums1[i--]; } else { nums1[k--] = nums2[j--]; } } } }
环形链表 力扣
题目描述 给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
题目解答 快慢指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class Solution { public boolean hasCycle (ListNode head) { if (head == null || head.next == null ) return false ; ListNode fast = head.next,slow = head; while (slow != null && fast != null ){ if (fast == slow){ return true ; } slow = slow.next; if (fast.next != null ){ fast = fast.next.next; } else { return false ; } } return false ; } }
最长子序列 力扣
题目描述 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
1 2 3 4 5 输入: s = "abpcplea", d = ["ale","apple","monkey","plea"] 输出: "apple"
示例 2:
1 2 3 4 5 输入: s = "abpcplea", d = ["a","b","c"] 输出: "a"
题目解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution { public String findLongestWord (String s, List<String> d) { String rlt = "" ; for (String target:d){ int l1 = rlt.length(),l2 = target.length(); if (l1 > l2 || (l1 == l2 && rlt.compareTo(target) < 0 )){ continue ; } if (isSubstr(s,target)){ rlt = target; } } return rlt; } private boolean isSubstr (String s,String target) { int i = 0 ,j = 0 ; while (i < s.length() && j < target.length()){ if (s.charAt(i) == target.charAt(j)){ j++; } i++; } return j == target.length(); } }