剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
思路
因为是只要求打印节点值,所以可以用一个ArrayList存每个节点值,最后将ArrayList顺序逆反就行
完整代码
public int[] reversePrint(ListNode head) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(head == null) {
return null;
}
ListNode pListNode = head;
while(pListNode != null) {
arr.add(pListNode.val);
pListNode = pListNode.next;
}
Collections.reverse(arr);
int[] ans = new int[arr.size()];
for(int i = 0; i < arr.size(); i++) {
ans[i] = arr. get(i);
}
return ans;
}
448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
思路
1.这个题用hashmap或者hashset是很好做的。
2.对于不使用额外空间的且时间复杂度为O(n)的方法,官方解答是用了原地修改数组来实现的:对于出现的数,将位置值为该数的数变为负数。已经成为负数的数不再改变。最后没有变为负数的位置也就是没有出现的数字。
public List<Integer> findDisappearedNumbers(int[] nums){
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
for (int e : nums) {
if(!hashMap.containsKey(e)) {
hashMap.put(e, 1);
}else {
hashMap.put(e, hashMap.get(e) + 1);
}
}
List<Integer> ansIntegers = new ArrayList<Integer>();
for(int i = 1; i <= nums.length; i++) {
if(!hashMap.containsKey(i)) {
ansIntegers.add(i);
}
}
return ansIntegers;
}
public List<Integer> findDisappearedNumbers(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if(nums[Math.abs(nums[i]) - 1] > 0) {
nums[Math.abs(nums[i]) - 1] *= -1;
}
}
List<Integer> ansList = new ArrayList<Integer>();
for (int j = 0; j < nums.length; j++) {
if(nums[j] > 0) {
ansList.add(j + 1);
}
}
return ansList;
}