【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【贪心】2023C-变换最小字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

2024-03-15 1435阅读

温馨提示:这篇文章已超过390天没有更新,请注意相关的内容是否还可用!

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 补充说明
    • 示例一
      • 输入
      • 输出
      • 说明
      • 示例二
        • 输入
        • 输出
        • 说明
        • 解题思路
          • 暴力法
          • 为什么是贪心
          • 一个带图的例子
          • 代码
            • 解法一:暴力法
              • python
              • java
              • cpp
              • 时空复杂度
              • 解法二:贪心
                • python
                • java
                • C++
                • 时空复杂度
                • 华为OD算法/大厂面试高频题算法练习冲刺训练

                  题目描述与示例

                  题目描述

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

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

                  输入描述

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

                  输出描述

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

                  补充说明

                  s是都是小写字符组成

                  1  stack[-1]:
                          if lst[i] > lst[stack[-1]]:
                              lst[i], lst[stack[-1]] = lst[stack[-1]], lst[i]
                              ans = "".join(lst)
                              break
                          else:
                              continue
                      else:
                          stack.pop()
                  

                  一个带图的例子

                  再举一个例子,s = "aabcbcdcd",答案应该为ans = "aabbccdcd",可以做出如下图

                  【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【贪心】2023C-变换最小字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

                  逆序遍历字符串s,构建栈stack = [8, 7, 4, 1],为可能进行交换的那些对应字符字典序较小且靠后的位置。

                  【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【贪心】2023C-变换最小字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

                  正序遍历i,反复拿出栈顶索引对应的元素s[stack[-1]]对应的字符和i对应的元素s[i]进行比较。会经历如下过程。

                  【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【贪心】2023C-变换最小字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

                  i

                  【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【贪心】2023C-变换最小字符串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

                  i

                  代码

                  解法一:暴力法

                  python

                  # 题目:【贪心】2023C-变换最小字符串
                  # 分值:100
                  # 作者:闭着眼睛学数理化
                  # 算法:暴力
                  # 代码看不懂的地方,请直接在群上提问
                  # 输入原字符串
                  s = input()
                  # 初始化答案ans为s
                  ans = s
                  # 获得字符串s的长度n
                  n = len(s)
                  # 将s转化列表,方便交换操作
                  lst = list(s)
                  # 枚举下标i和下标j
                  for i in range(n-1):
                      for j in range(i+1, n):
                          # 令下标对(i, j)对应的两个字符进行交换
                          lst[i], lst[j] = lst[j], lst[i]
                          # 把交换后得到的字符串和ans进行比较,更新ans
                          ans = min("".join(lst), ans)
                          # 判断完毕后,下标对(i, j)对应的两个字符重新交换回去
                          lst[i], lst[j] = lst[j], lst[i]
                  print(ans)
                  

                  java

                  import java.util.Scanner;
                  public class Main {
                      public static void main(String[] args) {
                          Scanner scanner = new Scanner(System.in);
                          String s = scanner.nextLine();
                          char[] ans = s.toCharArray();
                          int n = s.length();
                          for (int i = 0; i  
                  

                  cpp

                  #include 
                  #include 
                  int main() {
                      std::string s;
                      std::cin >> s;
                      std::string ans = s;
                      int n = s.length();
                      for (int i = 0; i  lst[stack.peek()]) {
                                      char temp = lst[i];
                                      lst[i] = lst[stack.peek()];
                                      lst[stack.peek()] = temp;
                                      ans = new String(lst).toCharArray();
                                      break;
                                  }
                                  // 否则,考虑下一个i
                              }
                              // 如果当前下标i不位于栈顶元素stack.peek()的左边
                              // 则弹出栈顶元素,考虑下一个字典序较大但是位于较右位置的字符
                              else {
                                  stack.pop();
                              }
                          }
                          System.out.println(new String(ans));
                      }
                  }
                  

                  C++

                  #include 
                  #include 
                  #include 
                  int main() {
                      std::string s;
                      std::cin >> s;
                      std::vector ans(s.begin(), s.end());
                      int n = s.length();
                      std::vector lst(s.begin(), s.end());
                      std::stack stack;
                      // 逆序遍历字符串s
                      for (int i = n - 1; i >= 0; i--) {
                          // 如果栈是空栈,或者当前下标i对应的字符lst[i]小于栈顶下标对应的字符lst[stack.top()]
                          // 则将坐标i加入stack
                          if (stack.empty() || lst[i]  lst[stack.top()]) {
                                  std::swap(lst[i], lst[stack.top()]);
                                  ans = lst;
                                  break;
                              }
                              // 否则,考虑下一个i
                          }
                          // 如果当前下标i不位于栈顶元素stack.top()的左边
                          // 则弹出栈顶元素,考虑下一个字典序较大但是位于较右位置的字符
                          else {
                              stack.pop();
                          }
                      }
                      std::cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]