ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode本周周赛

2021-12-05 13:02:32  阅读:126  来源: 互联网

标签:tmp 周赛 cur int 本周 leetcode next root 节点


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];
    }
};

第四题就算了,不会

标签:tmp,周赛,cur,int,本周,leetcode,next,root,节点
来源: https://blog.csdn.net/m0_56134903/article/details/121727521

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有