- Ransom Note
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
这道题其实是求第二个字符串是否能完全包含第一个字符串的所有字符的问题,一开始可能会想到直接使用contains方法去判断,但是如果例如“ab”,“cacb”这样,使用contains方法返回false,但是本题需要返回true。所以必须把字符一个一个的解析出来进行比对。
参考https://discuss.leetcode.com/topic/53864/java-o-n-solution-easy-to-understand/5
首先,由于给定的都是标准的小写字母,可以新建一个字符数组,用于存储26个字母,然后对magazine的所有的字符进行循环,统计其中每个字母出现的频数,填充arr数组。
再依次循环ransomNote的每个字符,从arr中减去其出现的频数,如果减的时候发现arr的元素成为负数,表示magazine中该字符出现的频数小于ransomNote中该字符出现的频数,则magazine必定无法包涵ransomNote,所以返回false,程序终止。
public boolean canConstruct(String ransomNote, String magazine) {
int[] arr = new int[26];
char[] m = magazine.toCharArray();
for(int i=0;i<m.length;i++){
arr[m[i]-'a']++;
}
char[] r = ransomNote.toCharArray();
for(int i=0;i<r.length;i++){
if(--arr[r[i]-'a']<0){
return false;
}
}
return true;
}
- Move Zeroes
Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.
这个问题如果没有下面的限制的话,我想我会新建一个数组然后把非0的值都插入到新数组里然后再给剩余的元素赋值为0.但是根据问题要求,有了以下解决方法。
使用一个类似指针的insertPos,将非0的值直接覆盖到前面的0值的位置中去,然后在数组的结尾补上缺掉的0值。
public void moveZeroes(int[] nums) {
int insertPos = 0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0) {
nums[insertPos++] = nums[i];
}
}
while(insertPos<nums.length){
nums[insertPos++] = 0;
}
}