华为OD机试题,只交换一次字符串中2个字符的位置,使字符串字典顺序最小,java语言

初学者,写的比较啰嗦且不简洁,仅供参考,见谅!

今年9月份参加华为od机试,抽到的题,给一任意字符串,仅交换一次字符串中两个字符位置,使字符串字典顺序最小!

如 输入abcfd,输出 abcdf,输入fcgad, 输出acgfd。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.next();
    char[] chars = str.toCharArray();
    char[] tmp = str.toCharArray();
    //将字符串按照字典顺序排序
    Arrays.sort(tmp);
    //从前往后遍历字符串将第一个非最佳排序字符索引求出
    int flag=-1;
    for (int i = 0; i < chars.length; i++) {
        if (chars[i]-tmp[i]==0){
            continue;
        }else {
            flag=i;
            break;
        }
    }
    String result = "";
    if (flag!=0&&flag!=-1){
    //截取非最佳排序字符串
    char[] goal = str.substring(flag).toCharArray();
    char[] sign = str.substring(flag).toCharArray();
    char fig='z';
    //求取出非最佳排序片段中的字典顺序最靠前字符
    for (int i = 0; i < goal.length; i++) {
        if (goal[i]<fig){
            fig=goal[i];
        }
    }
    //求出非最佳排序片段中的字典顺序最小字符的最靠后索引
    int max=-1;
    for (int i = goal.length-1; i >=0; i--) {
        if (goal[i]-fig==0){
            max=i;
            break;
        }
    }
    //将flag与max位置调换即可
    sign[0]=goal[max];
    sign[max]=goal[0];
    for (char c : sign) {
        result+=c;
    }
    result=str.substring(0,flag)+result;
    }else if (flag==-1){
        result=str;
    }else{
        char fig='z';
        //求取出非最佳排序片段中的字典顺序最小字符
        for (int i = 0; i < chars.length; i++) {
            if (chars[i]<fig){
                fig=chars[i];
            }
        }
        int max = str.lastIndexOf(fig);
        char[] tmp2 = str.toCharArray();
        tmp2[0]=chars[max];
        tmp2[max]=chars[0];
        for (char c : tmp2) {
            result+=c;
        }
    }
    System.out.println(result);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值