最新华为OD机试真题-字符串变换(100分)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-D卷的三语言AC题解

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

=> 字符串变换(100分) <=

华为OD

🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~

🍓OJ题目截图

alt

🫐 字符串变换

问题描述

K小姐有一个由小写字母组成的字符串 。现在她想对字符串 进行变换,使得变换后的字符串字典序最小。

变换的规则是:在字符串中选择任意两个不同位置的字符,然后交换它们的位置。K小姐最多只能进行一次这样的变换。

请你帮助K小姐找到变换后字典序最小的字符串。

输入格式

输入一行,包含一个由小写字母组成的字符串

输出格式

输出一行,表示变换后字典序最小的字符串。

样例输入1

abcdef

样例输出1

abcdef

样例输入2

bcdefa

样例输出2

acdefb

数据范围

,其中 表示字符串 的长度。

题解

可以先将字符串 转换为字符数组,然后对该数组进行排序,得到字典序最小的字符串 。如果 相同,说明 已经是字典序最小的字符串,直接返回 即可。

否则,从左到右遍历字符串 ,找到第一个与 对应位置字符不同的位置 。然后在 中从右往左找到最后一个等于 的位置 ,交换 ,即可得到字典序最小的字符串。

时间复杂度为 ,空间复杂度为 。其中 为字符串 的长度。时间复杂度 ,空间复杂度 。其中 为字符串长度。

参考代码

  • Python
s = input()

def getResult():
    min_s = sorted(s)
    
    if s == ''.join(min_s):
        return s
    
    s_list = list(s)
    
    for i in range(len(s)):
        if s_list[i] != min_s[i]:
            j = s.rindex(min_s[i])
            s_list[i], s_list[j] = s_list[j], s_list[i]
            break
    
    return ''.join(s_list)

print(getResult())
  • Java
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(getResult(s));
    }
    
    private static String getResult(String s) {
        char[] minArr = s.toCharArray();
        Arrays.sort(minArr);
        String minStr = new String(minArr);
        
        if (s.equals(minStr)) {
            return s;
        }
        
        char[] sArr = s.toCharArray();
        
        for (int i = 0; i < s.length(); i++) {
            if (sArr[i] != minArr[i]) {
                int j = s.lastIndexOf(minArr[i]);
                swap(sArr, i, j);
                break;
            }
        }
        
        return new String(sArr);
    }
    
    private static void swap(char[] arr, int i, int j) {
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}
  • Cpp
#include <iostream>
#include <algorithm>
using namespace std;

string getResult(string s) {
    string minStr = s;
    sort(minStr.begin(), minStr.end());
    
    if (s == minStr) {
        return s;
    }
    
    for (int i = 0; i < s.length(); i++) {
        if (s[i] != minStr[i]) {
            int j = s.find_last_of(minStr[i]);
            swap(s[i], s[j]);
            break;
        }
    }
    
    return s;
}

int main() {
    string s;
    cin >> s;
    cout << getResult(s) << endl;
    return 0;
}
#机械人怎么评价今年的华为##华为OD##华为OD机试算法题库##华为##华为od题库#
最新华为OD机试-D卷 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD-C/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 提供OJ在线评测

全部评论
🌍 评测功能需要 订阅专栏 后联系清隆解锁~
点赞
送花
回复 分享
发布于 07-02 11:05 浙江

相关推荐

先介绍一下楼主bg:24届普通一本,计科专业,秋招被刷,在春招时通过boss直聘第一次了解到OD,然后加上hr3.25加上hr微信,他只发了图一的题库给我,我在牛客上刷华为机试题目,100多道,大概是刷了90道左右4.12第一次催我机试,并且没有告知不能提前机试4.16告诉我考的是D卷的题,不是牛客上的华为机试的题,让我重新开始刷4.26第二次催我机试5.21第三次催机试6.4配置机考6.5机试三道题1.小明给小朋友身高排序2.出租车司机计程表没有4,求真实支付金额3.文本统计第一题用Arrays.sort自定义排序解决,第二道就是十进制换九进制,第三道是正则表达式拼了很久拼出来的,最后总共用时100min左右,中途家里人打了个电话过来,因为在考试直接挂了,手机监控弹了个监控中断,要求点击确认的提示框,忙着敲代码没注意看,考完了才发现,后续跟hr说了,对方也说没多大问题6.6出成绩,400分,但是因为电话的事情判定有作弊行为,hr说资面说清楚就行,没什么大问题6.9开始有意无意暗示我不是目标院校(四电四邮+985+部分211),通过几率不大,让我做好后手准备(甚至用出了面试也分通过和不通过这种话术,问题是我现在连约面都没有,而且按这个逻辑机试也分通过和不通过,那干嘛还一直让我考)6.17我第一次得知应届生不能提前机试,我去问hr我的成绩是不是作废,他说有些部门接受提前机试的成绩6.18告诉我以前不管这些,是最近开始才限制不能提前机试
查看3道真题和解析 投递华为等公司10个岗位
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务