给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。
进阶:
示例 1:
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
class Solution {
public int missingNumber(int[] nums) {
Set<Integer> num = new HashSet<>();
for (int i : nums) {
num.add(i);
}
for (int i = 0; i <= nums.length + 1; i++) {
if (!num.contains(i))
return i;
}
return 0;
}
}
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length;
int left = 0;
int right = 0;
while (right < n) {
if (nums[right] != 0) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
}
right++;
}
}
}
给定一种规律 pattern
和一个字符串 str
,判断 str
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
class Solution {
public boolean wordPattern(String pattern, String s) {
Map<Character, String> ch2str = new HashMap<>();
Map<String, Character> str2ch = new HashMap<>();
int m = s.length();
int i = 0;
for (int p = 0; p < pattern.length(); p++) {
char ch = pattern.charAt(p);
if (i >= m) {
return false;
}
int j = i;
while (j < m && s.charAt(j) != ' ') {
j++;
}
String temp = s.substring(i, j);
if (str2ch.containsKey(temp) && str2ch.get(temp) != ch)
return false;
if (ch2str.containsKey(ch) && !ch2str.get(ch).equals(temp))
return false;
str2ch.put(temp, ch);
ch2str.put(ch, temp);
i = j + 1;
}
return i >= m;
}
}
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
输入:head = [1,2,3,4]
输出:[2,1,4,3]
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode newNode = head.next;
head.next = swapPairs(newNode.next);
newNode.next = head;
return newNode;
}
}