Leetcode每日随机2021/5/11

今天的题比较简单。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一题
dfs
第二题
我习惯把图换成邻接矩阵来做,这题也就是照着做就行了
第三题
经典题了,两轮异或。

代码

第一题

class Solution {
    private int count = 0;
	
	public int findTargetSumWays(int[] nums, int target) {
		dfs(nums, 0, 0, target);
		return count;
    }
	
	private void dfs(int[] nums,int idx,int sum,int target) {
		if (idx == nums.length) {
			if (sum == target) {
				count++;
			}
			return;
		}
		dfs(nums, idx + 1, sum + nums[idx], target);
		dfs(nums, idx + 1, sum - nums[idx], target);
	}
}

第二题

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> neighbors;
    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }
    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}
*/

class Solution {
    public Node cloneGraph(Node node) {
        if (node == null) {
			return null;
		}
		int len = 0;
		Set<Node> visited = new HashSet<Node>();
		Set<String> edges = new HashSet<String>();
		Queue<Node> queue = new LinkedList<Node>();
		queue.offer(node);
		visited.add(node);
		while (!queue.isEmpty()) {
			Node temp = queue.poll();
			len = temp.val > len ? temp.val : len;
			for (Node neighbor : temp.neighbors) {
				edges.add(Math.min(temp.val, neighbor.val) + "," + Math.max(temp.val, neighbor.val));
				if (!visited.contains(neighbor)) {
					visited.add(neighbor);
					queue.offer(neighbor);
				}
			}
		}
		int[][] graph = new int[len][len];
		for (String edge : edges) {
			String[] arr = edge.split(",");
			int a = Integer.valueOf(arr[0]), b = Integer.valueOf(arr[1]);
			graph[a - 1][b - 1] = 1;
			graph[b - 1][a - 1] = 1;
		}
		List<Node> list = new ArrayList<Node>();
		for (int i = 1; i <= len; i++) {
			list.add(new Node(i, new ArrayList<Node>()));
		}
		for (int i = 0; i < len; i++) {
			Node temp = list.get(i);
			for (int j = 0; j < len; j++) {
				if (graph[i][j] == 1) {
					temp.neighbors.add(list.get(j));
				}
			}
		}
		return list.get(node.val - 1);
	}
}

第三题

class Solution {
    public int[] singleNumber(int[] nums) {
		int temp = nums[0];
		for (int i = 1; i < nums.length; i++) {
			temp ^= nums[i];
		}
		String s = Integer.toBinaryString(temp);
		int idx = 0;
		for (int i = s.length() - 1; i >= 0; i--, idx++) {
			if (s.charAt(i) == '1') {
				break;
			}
		}
		int a = 0, b = 0;
		boolean flagA = true, flagB = true;
		for (int i = 0; i < nums.length; i++) {
			String binary = Integer.toBinaryString(nums[i]);
			if (binary.length() - 1 - idx < 0 || binary.charAt(binary.length() - 1 - idx) == '0') {
				if (flagA) {
					a = nums[i];
					flagA = false;
				} else {
					a ^= nums[i];
				}
			} else {
				if (flagB) {
					b = nums[i];
					flagB = false;
				} else {
					b ^= nums[i];
				}
			}
		}
		return new int[] { a, b };
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值