字符串变换最小字符串 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

给定一个字符串s, 最多只能进行一次变换, 返回变换后能得到的最小字符串(按照字典序进行比较)。

变换规则: 交换字符串中任意两个不同位置的字符。

输入描述

一串小写字母组成的字符串s。

输出描述

按照要求进行变换得到的最小字符串。

备注

  • s是都是小写字符组成

  • 1<=s.length<=1000

示例1

输入:
abcdef

输出:
abcdef

说明:abcdef已经是最小字符串,不需要交换

示例2

输入:
bcdefa

输出:
acdefb

说明:a和b进行位置交换,可以得到最小字符串

题解

贪心的题目

字典序最小,字符串越前面优先级越大,因此从左往右遍历字符串,遍历的同时右侧寻找可以交换的位置(字典序更小)。

如果找到了可以交换的位置则交换字符然后返回结果即可。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        char[] cs = s.toCharArray();
        int len = cs.length;

        for (int left = 0; left < len; left++) {
            // 右侧寻找小于 cs[left] 的最小字符,如果有多个则取最右边的一个
            int idx = left;
            for (int right = left + 1; right < len; right++) {
                if (cs[right] <= cs[idx]) {
                    idx = right;
                }
            }

            if (cs[idx] != cs[left]) {
                char tmp = cs[idx];
                cs[idx] = cs[left];
                cs[left] = tmp;
                break;
            }
        }

        s = String.valueOf(cs);
        System.out.println(s);
    }

}

Python

cs = list(input())
len_s = len(cs)

for left in range(len_s):
    # 右侧寻找小于 cs[left] 的最小字符,如果有多个则取最右边的一个
    idx = left
    for right in range(left + 1, len_s):
        if cs[right] <= cs[idx]:
            idx = right

    if cs[idx] != cs[left]:
        cs[idx], cs[left] = cs[left], cs[idx]
        break

result = ''.join(cs)
print(result)

C++

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    getline(cin, s);
    int len = s.length();
    char cs[len];
    strcpy(cs, s.c_str());

    for (int left = 0; left < len; left++) {
        // 右侧寻找小于 cs[left] 的最小字符,如果有多个则取最右边的一个
        int idx = left;
        for (int right = left + 1; right < len; right++) {
            if (cs[right] <= cs[idx]) {
                idx = right;
            }
        }

        if (cs[idx] != cs[left]) {
            char tmp = cs[idx];
            cs[idx] = cs[left];
            cs[left] = tmp;
            break;
        }
    }

    s = string(cs);
    cout << s << endl;

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##春招##秋招##校招##华为#
全部评论
static String f(String s){ int n = s.length(); if (n == 1) return s; char[] c = s.toCharArray(); out: for (int i = 0; i < n; i++) { for (int j = n - 1; j > i ; j--) { if (c[j] < c[i]){ char t = c[j]; c[j] = c[i]; c[i] = t; break out; } } } return String.valueOf(c); }
2 回复 分享
发布于 2024-09-26 16:54 广西
public class Main { public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException{ char[] cs = reader.readLine().toCharArray(); for (int i = 0; i < cs.length; i++) { char min = cs[i]; int minIndex = i; for (int j = i + 1; j < cs.length; j++) { if (cs[j] < min) { min = cs[j]; minIndex = j; } } if (minIndex != i) { char temp = cs[i]; cs[i] = cs[minIndex]; cs[minIndex] = temp; break; } } System.out.println(new String(cs)); } } 为啥只能过 26%的用例
点赞 回复 分享
发布于 2024-07-27 17:47 河南

相关推荐

08-16 10:51
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
09-29 16:59
已编辑
门头沟学院 Java
理智的小猫不讲武德:接好运
投递大疆等公司10个岗位
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

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