题
今天的题比较简单。
思
第一题
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 };
}
}