1、 找出 3 位偶数
给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。你需要找出 所有 满足下述条件且 互不相同 的整数:
该整数由 digits 中的三个元素按任意顺序依次连接组成。
该整数不含前导零
该整数是一个偶数
例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。
输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]
代码:
Java
class Solution {
public int[] findEvenNumbers(int[] d) {
int n = d.length;
TreeSet<Integer> h = new TreeSet<>();
for (int i = 0; i < n; i++)
if (d[i] > 0)
for (int j = 0; j < n; j++)
if (j != i)
for (int k = 0; k < n; k++)
if (k != i && k != j) {
int x = d[i] * 100 + d[j] * 10 + d[k];
if (x % 2 == 0)
h.add(x);
}
int[] ans = new int[h.size()];
int p = 0;
for (int x : h)
ans[p++] = x;
return ans;
}
}
C++
class Solution {
public:
vector<int> findEvenNumbers(vector<int>& a) {
int n = a.size();
set<int> s;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k < n; ++k) {
if (i == j || j == k || i == k || a[i] == 0 || a[k] % 2)
continue;
s.insert(a[i] * 100 + a[j] * 10 + a[k]);
}
vector<int> ans;
for (auto x : s) ans.push_back(x);
return ans;
}
};
2、删除链表的中间节点
给你一个链表的头节点head。删除链表的中间节点,并返回修改后的链表的头节点head。长度为n的链表的中间结点是从头数起第n/2个结点(下标从0开始)。
对于n=1、2、3、4、5的情况中间节点的下标分别是0、1、1、2、2。
输入:1->3->4->7->1->2->6
输出:1->3->4->1->2->6
输入:1->2->3->4
输出:1->2->4
输入:2->1
输出:2
代码实现:
java
class Solution {
public ListNode deleteMiddle(ListNode head) {
if (head.next == null) {
return null;
}
ListNode p = head;
ListNode q = head;
ListNode prev = null;
while (p != null && p.next != null) {
prev = q;
q = q.next;
p = p.next.next;
}
prev.next = prev.next.next;
q.next = null;
return head;
}
}
C++
class Solution {
public:
ListNode* deleteMiddle(ListNode* head) {
vector<int> a;
for (auto p = head; p; p = p->next) a.push_back(p->val);
auto ans = new ListNode(0);
auto cur = ans;
int n = a.size();
for (int i = 0; i < n; ++i) {
if (i == n / 2) continue;
cur->next = new ListNode(a[i]);
cur = cur->next;
}
return ans->next;
}
};
3、从二叉树一个节点到另一个节点每一步的方向
给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点。每个节点的值为 1 到 n 中的一个整数,且互不相同。给你一个整数 startValue ,表示起点节点 s 的值,和另一个不同的整数 destValue ,表示终点节点 t 的值。
请找到从节点 s 到节点 t 的 最短路径 ,并以字符串的形式返回每一步的方向。每一步用 大写 字母 ‘L’ ,‘R’ 和 ‘U’ 分别表示一种方向:
‘L’ 表示从一个节点前往它的 左孩子 节点。
‘R’ 表示从一个节点前往它的 右孩子 节点。
‘U’ 表示从一个节点前往它的 父 节点。
请你返回从 s 到 t 最短路径 每一步的方向。
示例:
输入:root = [5,1,2,3,null,6,4], startValue = 3, destValue = 6
输出:“UURL”
解释:最短路径为:3 → 1 → 5 → 2 → 6 。
代码
Java
class Solution {
public String getDirections(TreeNode root, int startValue, int destValue) {
List<Node> startList = new ArrayList<>();
List<Node> destList = new ArrayList<>();
List<Node> tmp = new ArrayList<>();
tmp.add(new Node(root.val, 'X'));
dfs(startList, tmp, root, startValue);
dfs(destList, tmp, root, destValue);
StringBuilder sb = new StringBuilder();
int n = startList.size();
int m = destList.size();
int min = Math.min(n, m);
int i = 0;
for ( ; i < min; i++) {
if (startList.get(i).val == destList.get(i).val) {
continue;
}
break;
}
for (int j = i; j < n; j++) {
sb.append('U');
}
for (int j = i; j < m; j++) {
sb.append(destList.get(j).dir);
}
return sb.toString();
}
private void dfs(List<Node> list, List<Node> tmp, TreeNode cur, int target) {
if (cur.val == target) {
list.addAll(tmp);
return;
}
if (cur.left != null) {
tmp.add(new Node(cur.left.val, 'L'));
dfs(list, tmp, cur.left, target);
tmp.remove(tmp.size() - 1);
}
if (cur.right != null) {
tmp.add(new Node(cur.right.val, 'R'));
dfs(list, tmp, cur.right, target);
tmp.remove(tmp.size() - 1);
}
}
private class Node {
int val;
char dir;
public Node(int val, char dir) {
this.val = val;
this.dir = dir;
}
}
}
C++
class Solution {
public:
string getDirections(TreeNode* root, int startValue, int destValue) {
string cur;
string r[2];
function<void(TreeNode*, int, int)> dfs = [&](TreeNode* root, int target, int idx) {
if(root) {
if(root->val == target) {
r[idx] = cur;
} else {
cur.push_back('L');
dfs(root->left, target, idx);
cur.pop_back();
cur.push_back('R');
dfs(root->right, target, idx);
cur.pop_back();
}
}
};
dfs(root, startValue, 0);
dfs(root, destValue, 1);
int p = 0;
while(p < r[0].size() && p < r[1].size() && r[0][p] == r[1][p]) ++p;
r[0].erase(r[0].begin(), r[0].begin() + p);
r[1].erase(r[1].begin(), r[1].begin() + p);
for(char& c : r[0]) {
c = 'U';
}
return r[0] + r[1];
}
};
第四题就算了,不会