670. 最大交换 AND 剑指 Offer 27. 二叉树的镜像

222 阅读2分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

670. 最大交换

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736 输出: 7236 解释: 交换数字2和数字7。 示例 2 :

输入: 9973 输出: 9973 解释: 不需要交换。

解题思路

目标就是优先锁定高位,像低位找比当前位更大的,并且位置越后越好,因为越前的位置占的权重越大,而我们交换以后会让低位变小,因此我们是需要优先将小权重的数位变小

例1:2 7 3 6

满足条件的最高位为千位,比其右侧的最大值(百位)小,交换得到7 2 3 6

例2:9 8 5 6 8

满足条件的最高位为百位,比其右侧的最大值(个位)小,交换得到9 8 8 6 5

例3:8 9 5 6 9 满足条件的最高位为万位,比其右侧的最大值(千位和个位)小,取低位的个位交换得 9 9 5 6 8

代码

class Solution {
        public int maximumSwap(int num) {

            char[] chars = String.valueOf(num).toCharArray();
            int n=chars.length;
            for (int i=0;i<n;i++)
            {
                int c=i;
                for (int j=i+1;j<n;j++)
                {
                    if (chars[i]!=chars[j]&&chars[j]>=chars[c])
                        c=j;
                }
                if (c!=i)
                {
                    char t=chars[c];
                    chars[c]=chars[i];
                    chars[i]=t;
                    return Integer.parseInt(new String(chars));
                }
            }
            return num;
        }
}

剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:


     4
   /   \
  2     7
 / \   / \
1   3 6   9
镜像输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

示例 1:

输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]

解题思路

交换子节点位置,再递归处理子节点.如果我们只需要交换两棵子树的位置,然后对当前遍历到的节点root 的左右两棵子树翻转得到镜像,那么,即可得到以 root 为根节点的整棵子树的镜像

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
        public TreeNode mirrorTree(TreeNode root) {

            if (root==null) return null;
            TreeNode t=root.left;
            root.left=root.right;
            root.right=t;
            mirrorTree(root.left);
            mirrorTree(root.right);
            return root;
        }
}