【LeetCode每日一题】——899.有序队列

一【题目类别】

  • 排序

二【题目难度】

  • 困难

三【题目编号】

  • 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为字符串长度

九【代码实现】

  1. 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);
        }
    }

}
  1. 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;
	}
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值