21/02/24刷题记录Day6

剑指 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;

    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值