一【题目类别】
- 排序
二【题目难度】
- 困难
三【题目编号】
- 899.有序队列
四【题目描述】
- 给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。
- 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。
五【题目示例】
-
示例 1:
- 输入:s = “cba”, k = 1
- 输出:“acb”
- 解释:
- 在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。
- 在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。
-
示例 2:
- 输入:s = “baaca”, k = 3
- 输出:“aaabc”
- 解释:
- 在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。
- 在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。
六【解题思路】
- 通过仔细观察示例我们可以发现:
- 当k=1时:我们只能每次移动一个,也就是我们只需要将每个字符都移动到末尾一次,看哪个小即可,当然,这里需要存储原本的字符串,用于比较使用,如果有更小的就更新一下
- 当k>1时:我们发现在这种情况下,可以实现交换两个相邻字符,也就是说可以做到类似冒泡排序的交换步骤,将大的字符放到后面,小的字符放到前面,这也就是一个类似于冒泡排序的过程,那么我们就可以直接对其进行排序,因为一定可以将s变为升序字符串,这时肯定是最小的,因为最小的字符都在前面
- 经过判断后进行不同的操作,最终返回结果即可
七【题目提示】
- 1 <= k <= S.length <= 1000
- s 只由小写字母组成。
八【时间频度】
- 时间复杂度
- k = 1: O ( n 2 ) O(n^2) O(n2),其中 n n n为字符串长度
- k > 1: O ( n l o g n ) O(nlogn) O(nlogn),其中 n n n为字符串长度
- 空间复杂度
- k = 1: O ( n ) O(n) O(n),其中 n n n为字符串长度
- k > 1: O ( l o g n ) O(logn) O(logn),其中 n n n为字符串长度
九【代码实现】
- Java语言版
package Sort;
import java.util.Arrays;
/**
* @Author: IronmanJay
* @Description: 899.有序队列
* @CreateTime: 2022-11-19 09:25
*/
public class p899_OrderlyQueue {
public static void main(String[] args) {
String s = "cba";
int k = 1;
String res = orderlyQueue(s, k);
System.out.println("res = " + res);
}
public static String orderlyQueue(String s, int k) {
if (k == 1) {
String str = s;
StringBuilder sb = new StringBuilder(s);
int len = s.length();
for (int i = 1; i < len; i++) {
char c = sb.charAt(0);
sb.deleteCharAt(0);
sb.append(c);
if (sb.toString().compareTo(str) < 0) {
str = sb.toString();
}
}
return str;
} else {
char[] arr = s.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
}
}
- C语言版
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int compare_p899_OrderlyQueue(char* a, char* b)
{
return *(char *)a - *(char *)b;
}
char * orderlyQueue(char * s, int k)
{
int len = strlen(s);
if (k == 1)
{
char* str = (char *)malloc(sizeof(char) * (len + 1));
strcpy(str, s);
for (int i = 1; i < len; i++)
{
char c = s[0];
for (int j = 0; j < len - 1; j++)
{
s[j] = s[j + 1];
}
s[len - 1] = c;
if (strcmp(s, str) < 0)
{
strcpy(str, s);
}
}
return str;
}
else
{
qsort(s, len, sizeof(char), compare_p899_OrderlyQueue);
return s;
}
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版