这是我参与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;
}
}