【华为OD题库-029】恢复数字序列-java

news/2024/5/20 6:30:57 标签: 华为od, java, 链表, 滑动窗口

题目

对于一个连续正整数组成的序列,可以将其拼接成一个字符串,再将字符串里的部分字符打乱顺序。如序列89101112, 拼接成的字符串19810112,打乱部分字符后得908112111。原来的正整数10就被拆成了0和1.现给定一个按如上规则得到的打乱字符的字符串,请将其还原成连续正整数序列,并输出序列中最小的数字,
输入描述
输入行,为打乱字符的字符串和正整数序列的长度,两者间用空格分隔,字符审长度不超过200,正整数不超过10000 保证输入可以还原成唯一序列。
输出描述
输出一个数字,为序列中最小的数字
示例1:
输入
19801211 5
输出
8
说明: 正常的数字序列为8 9 10 11 12这5个数字,最小数宇为8

思路

暴力法

  1. 最小值设为start=1,根据输入的序列长度n,得到start开始,长度为n的字符串tempstr
  2. 判断tempStr通过打乱顺序后是否能和输入的字符串相等。
  3. 如果相等,则返回start,否则继续遍历。
    关键在于第2步:如果字符串a打乱后能够得到字符串b,那么字符串a和b通过排序后得到的字符串一定是相等的。

滑动窗口

判断字符串a打乱后是否能够得到字符串b?字符的范围为[0-9],可以用一个int[10]的数组记录每个字符串出现的次数,如下:
在字符串a中各字符出现的次数得到int[] freqa;
在字符串b中各字符出现的次数得到int[] freqb;

如果freqa和freqb中每个字符出现的次数相等,那么就a打乱顺序后可以得到b
滑动窗口法的代码步骤如下:

  1. 用一个int[10]的数组target_freqs,记录输入字符串每个字符串出现的次数
  2. 初始化窗口:[1,2,3,4,n-1]。使用cur_freqs记录当前窗口每个字符串出现的次数
  3. 如果cur_freqs和target_freqs每个字符出现的次数均相等,那么返回此窗口最左侧的值
  4. 否则,开始右移窗口,加入一个n,删除一个1,并且维护cur_freqs的值

题解

滑动窗口

java">package hwod;

import java.util.*;

public class RecoveryNumQueue {
    private static int[] target_freqs = new int[10];
    private static int[] cur_freqs = new int[10];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        final String[] inputs = sc.nextLine().split(" ");
        String s = inputs[0];
        int n = Integer.parseInt(inputs[1]);
        System.out.println(recoveryNumQueue(s, n));
    }

    //滑动窗口
    private static int recoveryNumQueue(String s, int n) {
        //统计输入的字符串每个字符出现的次数
        for (int i = 0; i < s.length(); i++) {
            target_freqs[s.charAt(i) - '0'] += 1;
        }

        //初始化滑动窗口
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            queue.addLast(i + 1);
            for (char c : String.valueOf(i + 1).toCharArray()) {
                cur_freqs[c - '0'] += 1;
            }
        }

        //移动窗口
        while (!check(cur_freqs, target_freqs)) {
            int addNum = queue.peekLast() + 1;
            for (char c : String.valueOf(addNum).toCharArray()) {
                cur_freqs[c - '0'] += 1;
            }
            queue.addLast(addNum);
            int removeNum = queue.peekFirst();
            for (char c : String.valueOf(removeNum).toCharArray()) {
                cur_freqs[c - '0'] -= 1;
            }
            queue.removeFirst();
        }
        return queue.peekFirst();
    }

    private static boolean check(int[] cur_freqs, int[] target_freqs) {
        for (int i = 0; i < 10; i++) {
            if (cur_freqs[i] != target_freqs[i]) return false;
        }
        return true;
    }
}

暴力破解

java">package hwod;

import java.util.*;

public class RecoveryNumQueue {
    private static int[] target_freqs = new int[10];
    private static int[] cur_freqs = new int[10];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        final String[] inputs = sc.nextLine().split(" ");
        String s = inputs[0];
        int n = Integer.parseInt(inputs[1]);
        System.out.println(recoveryNumQueue(s, n));



    }
    //暴力查找
    private static int recoveryNumQueue(String s, int n) {
        int ans = 0;
        while (true) {
            if (check(ans, n, s)) return ans;
            ans++;
        }

    }

    private static String sort(String string) {
        char[] chars = string.toCharArray();
        Arrays.sort(chars);
        return String.valueOf(chars);
    }

    private static boolean check(int start, int n, String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = start; i < start + n; i++) {
            sb.append(i);
        }
        return sort(sb.toString()).equals(s);
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5200109.html

相关文章

kettle官网和中文网地址

整理的kettle相关的网站地址&#xff1a; github 地址&#xff1a; https://github.com/pentaho/pentaho-kettle kettle下载目录&#xff1a; https://sourceforge/projects/pentaho/files/ kettle9.2下载地址&#xff1a; https://sourceforge/projects/pentaho/files/Penta…

mysql优化之explain 以及 索引优化

Mysql安装文档参考&#xff1a;https://blog.csdn.net/yougoule/article/details/56680952 Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设…

如何评估千兆光模块和万兆光模块的性能及稳定性

在互联网高速发展的情况下&#xff0c;网络通信产品中的千兆光模块和万兆光模块成为了网络中必不可少的配件之一。千兆光模块和万兆光模块的性能及稳定性是网络稳定的重要因素&#xff0c;其性能的优劣关系着网络服务器和客户端的通信速度、质量及数据传输的可靠性。那么&#…

Oracle 11g 多数据库环境下的TDE设置

19c的TDE wallet的设置是在数据库中设置的&#xff0c;也就是粒度为数据库&#xff0c;因此不会有冲突。 而11g的设置是在sqlnet.ora中&#xff0c;因此有可能产生冲突。 这里先将一个重要概念&#xff0c;按照文档的说法&#xff0c;wallet是不能被数据库共享的。 If there …

windows11系统如何设置锁屏壁纸

1. 在开始页面里面找到设置 2. 在设置里面找到个性化 3. 按照红色圈出部分操作 个性化锁屏界面 选择 图片 浏览照片 选择一张你觉得好看的图片作为锁屏壁纸 注&#xff1a;如果需要在锁屏后的登录页面显示壁纸 请勾选第三个红圈部分

Appium移动自动化测试—如何安装Appium

前言 Appium 自动化测试是很早之前就想学习和研究的技术了&#xff0c;可是一直抽不出一块完整的时间来做这件事儿。现在终于有了。 反观各种互联网的招聘移动测试成了主流&#xff0c;如果再不去学习移动自动化测试技术将会被淘汰。 web自动化测试的路线是这样的&#xff1…

Python3.11+Pyside6开发电影下载程序

VideoSave是一款使用Python3.11Pyside6编写的提供下载电影/电视剧的软件&#xff0c;支持注册、登录、搜索、下载、查看日志等功能&#xff0c;提供了Window、Mac系统安装包。 先上效果图 提供功能 节省寻找资源的时间 ⌚️模糊搜索指定影片 &#x1f434;查看影片下载日志 &…

女儿冬天的第一件羽绒服,这也太好看了

分享女儿的时尚穿搭 撞色插肩款羽绒服 同色系的精彩碰撞 描绘出绚烂的色彩 走在街上就是最靓的崽 显肤色显瘦超吸睛 妥投时尚小潮人一枚