题解 | #最大数字交换#

最大数字交换

https://www.nowcoder.com/practice/ffcd59fbf5814d2e94c0e2f4a679473c

import java.util.*;

/**
 * NC301 最大数字交换
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num string字符串
     * @return string字符串
     */
    public String maximumSwap (String num) {
        return solution1(num);
        // return solution2(num);
    }

    /**
     * 贪心
     * @param num
     * @return
     */
    private String solution1(String num){
        int n = num.length();
        if(n == 1){
            return num;
        }

        char[] digits = num.toCharArray();

        // rMaxIndex[i]: i右侧最大值索引
        int[] rMaxIndex = new int[n];
        rMaxIndex[n-2] = n-1;
        // 最大值索引
        int maxIndex = n-1;
        // 从右往左
        for(int i=n-2; i>0; i--){
            // 大于 保存当前处最大值索引(maxIndex等于i)
            // 等于 保存最右侧最大值索引(maxIndex不用变)
            if(digits[i] > digits[maxIndex]){
                maxIndex = i;
            }
            rMaxIndex[i-1] = maxIndex;
        }

        StringBuilder sb = new StringBuilder(num);
        for(int i=0; i<n-1; i++){
            if(digits[i] < digits[rMaxIndex[i]]){
                sb.setCharAt(i, digits[rMaxIndex[i]]);
                sb.setCharAt(rMaxIndex[i], digits[i]);
                break;
            }
        }

        return sb.toString();
    }

    /**
     * 排序+贪心
     * @param num
     * @return
     */
    private String solution2(String num){
        int n = num.length();
        if(n == 1){
            return num;
        }

        char[] digits = num.toCharArray();
        char[] numChs = num.toCharArray();

        // 升序
        Arrays.sort(numChs);
        // 降序
        char[] descDigits = new StringBuilder(new String(numChs)).reverse().toString().toCharArray();

        StringBuilder sb = new StringBuilder(num);
        for(int i=0; i<n-1; i++){
            if(digits[i] != descDigits[i]){
                int index = num.lastIndexOf(descDigits[i]);
                sb.setCharAt(i, descDigits[i]);
                sb.setCharAt(index, digits[i]);
                break;
            }
        }

        return sb.toString();
    }
}

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司8个岗位
点赞 评论 收藏
分享
06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务