字符串变换最小字符串 - 华为OD统一考试(C卷)
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
给定一个字符串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;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
#面经##春招##秋招##校招##华为#