两数之和Ⅱ-输入有序数组

力扣

题目描述

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 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 ,你要判断是否存在两个整数 ab,使得 a2 + b2 = c。

示例1:

1
2
3
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5

示例2:

1
2
输入: 3
输出: False

题目解答

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:

1
2
输入:"hello"
输出:"holle"

示例 2:

1
2
输入:"leetcode"
输出:"leotcede"

提示:

  • 元音字母不包含字母 “y” 。

题目解答

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:

1
2
输入: "aba"
输出: True

示例 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;
}
}

合并两个有序数组

力扣

题目描述

给你两个有序整数数组 nums1nums2,请你将 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();
}
}