给定两个字符串 s 和 t,它们只包含小写字母。
字符串 *t* 由字符串 *s* 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
class Solution {
public char findTheDifference(String s, String t) {
if ("".equals(s)) {
return t.charAt(0);
}
Map<Character, Integer> mapS = new HashMap<Character, Integer>();
Map<Character, Integer> mapT = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
if (!mapS.containsKey(s.charAt(i))) {
mapS.put(s.charAt(i), 1);
}
else {
mapS.put(s.charAt(i), mapS.get(s.charAt(i)) + 1);
}
}
for (int i = 0; i < t.length(); i++) {
if (!mapT.containsKey(t.charAt(i))) {
mapT.put(t.charAt(i), 1);
}
else {
mapT.put(t.charAt(i), mapT.get(t.charAt(i)) + 1);
}
}
for (char i = 'a'; i <= 'z'; i++) {
if (mapS.get(i) != mapT.get(i)) {
return i;
}
}
return ' ';
}
}
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode"
返回 0
class Solution {
public int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
for (int i = 0; i < s.length() ; i++) {
if (map.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
}
给你两个 没有重复元素 的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。
请你找出 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x
的下一个更大元素是指 x
在 nums2
中对应位置的右边的第一个比 x
大的元素。如果不存在,对应位置输出 -1
。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Deque<Integer> stack = new ArrayDeque<Integer>();
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums2.length; i++) {
while (!stack.isEmpty() && stack.peekLast() < nums2[i]) {
map.put(stack.removeLast(), nums2[i]);
}
stack.addLast(nums2[i]);
}
int[] ans = new int[nums1.length];
for (int i = 0; i < nums1.length; i++) {
ans[i] = map.getOrDefault(nums1[i], -1);
}
return ans;
}
}
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须** 原地 **修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
class Solution {
public void nextPermutation(int[] nums) {
if (nums.length <= 1){
return;
}
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = nums.length - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1);
}
public void swap(int[] nums, int i, int j) {
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
public void reverse(int[] nums, int start) {
int left = start;
int right = nums.length - 1;
while (left < right){
swap(nums, left, right);
left++;
right--;
}
}
}