百度&必应权4, 日IP8000. 查看详情
自助收录

2023年华为OD机考真题:去除多余空格

算法刷题2年前 (2023)更新 江南白衣
447 0 0
2023年华为OD机考真题:去除多余空格

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:去除多余空格
知识点字符串数组队列
时间限制:2s 空间限制:256MB 限定语言:不限
题目描述:
去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。

2023年华为OD机考真题:去除多余空格
条件约束:
1,不考虑关键词起始和结束位置为空格的场景;
2,单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束下标之间不会有多余的空格;
3,如果有单引号,则用例保证单引号成对出现;
4,关键词可能会重复;
5,文本字符长度length取值范围:[0, 100000];
输入描述:
输入为两行字符串:
第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。
第二行:关键词的开始和结束坐标,关键词间以逗号区分,关键词内的开始和结束位置以单空格区分。
例如:
Life is painting a picture, not doing ‘a sum’.
8 15,20 26,43 45
关键单词为:painting picture sum
输出描述:
输出为两行字符串:
第一行:去除多余空格后的文本
第二行:去除多余空格后的关键词的坐标开始和结束位置,为数组方式输出。
例如:
Life is painting a picture, not doing ‘a sum’.
[8, 15][19, 25][42, 44]
示例1
输入:
Life is painting a picture, not doing ‘a sum’.
8 15,20 26,43 45
输出:
Life is painting a picture, not doing ‘a sum’.
[8, 15][19, 25][42, 44]
说明:
a和picture中间多余的空格进行删除
示例2
输入:
Life is painting a picture, not doing ‘a sum’.
8 15,19 25,42 44
输出:
Life is painting a picture, not doing ‘a sum’.
[8, 15][19, 25][42, 44]
说明:
a和sum之间有多余的空格,但是因为有成对单引号,不去除多余空格
解题思路:
例如:
Life is painting a picture, not doing ‘a sum’.
8 15,20 26,43 45
1、先对文本进行去除多余空格,同时记录多余空格的坐标位置【18】;
2、遍历关键字词的坐标,让他跟多余空格坐标进行比较;
第一个字符[8,15],没有小于8和15的空格位置;
结论:坐标位置不变[8,15]
第二个字符[20,26],小于20和26的只有一个18;
结论:坐标整体向前移动1,坐标为[19,25]
第三个字符[43,45],小于43和45的只有一个18;
结论:坐标整体向前移动1,坐标为[42,44]
以下代码只有170分,没有通过的用例太长了,后面都是省略号,所以无从知晓未通过的实际用例是什么样子的;有三个同学都是170分,没通过的用例也是一样的,感觉又有幺蛾子!

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @title 去除多余空格
 * @Description 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。
 * 条件约束:
 * 1,不考虑关键词起始和结束位置为空格的场景;
 * 2,单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束下标之间不会有多余的空格;
 * 3, ……
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String resStr = "";
        //多余空格的坐标集合
        ArrayList<Integer> count = new ArrayList<>();
        //判断是否在引号内
        int flag = 0;
        for (int i = 0; i < s1.length() - 1; i++) {
            if (s1.charAt(i) == '\'') {
                flag++;
            }
            if (flag % 2 == 0) {
                if (s1.charAt(i) == ' ' && s1.charAt(i + 1) == ' ') {
                    count.add(i);
                    continue;
                }
            }
            resStr += s1.charAt(i);
        }
        //处理完对于空格的字符串
        resStr += s1.charAt(s1.length() - 1);

        String s2 = in.nextLine();
        String[] s2_1 = s2.split(",");
        //处理完的坐标集合
        ArrayList<Integer> resIndex = new ArrayList<>();
        for (String s : s2_1) {
            String[] t = s.split(" ");
            for (int i = 0; i < t.length; i++) {
                int tem = Integer.parseInt(t[i]);
                resIndex.add(tem - fun(count, tem));
            }
        }
        System.out.println(resStr);
        System.out.print("[");
        for (int i = 0; i < resIndex.size() - 1; i++) {
            System.out.print(resIndex.get(i));
            if (i % 2 == 0) {
                System.out.print(", ");
            } else {
                System.out.print("][");
            }
        }
        System.out.println(resIndex.get(resIndex.size() - 1) + "]");
    }

    //求出之前多余的空格
    public static int fun(List<Integer> list, int num) {
        int result = 0;
        for (Integer integer : list) {
            if (integer < num) {
                result++;
            }
        }
        return result;
    }
}

代码实现二:满分Java实现

package com.codernav.demo.hwod.exam;

import java.util.Scanner;

/**
 * @title 去除多余空格
 * @Description 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。
 * 条件约束:
 * 1,不考虑关键词起始和结束位置为空格的场景;
 * 2,单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束下标之间不会有多余的空格;
 * 3, ……
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line1 = scanner.nextLine().trim();
        String line2 = scanner.nextLine().trim();
        String[] key = line2.split(",");
        if (key.length > 3 || key.length == 0) {  //这个满分答案的不能大于3,我也不太理解,大家可以先存疑吧
            return;
        }
        //找到关键词
        String[] keywords = new String[key.length];
        for (int i = 0; i < key.length; i++) {
            String[] index = key[i].split(" ");
            if (index.length != 2) {
                break;
            }
            int start_index = Integer.parseInt(index[0]);
            int end_index = Integer.parseInt(index[1]);

            keywords[i] = line1.substring(start_index, end_index + 1);
        }
        //2 去除空格
        String output_str = "";
        char[] line1_bytes = line1.toCharArray();
        int index = 0;
        boolean last_space_flag = false;
        boolean last_single_mark_flag = false;
        while (index < line1.length()) {
            if (line1_bytes[index] == ' ') {
                if (last_space_flag && !last_single_mark_flag) {
                    index++;
                    continue;
                }
                last_space_flag = true;
            } else {
                last_space_flag = false;
            }

            if (line1_bytes[index] == '\'') {
                if (last_single_mark_flag) {
                    last_single_mark_flag = false;
                } else {
                    last_single_mark_flag = true;
                }
            }
            output_str += (line1_bytes[index]);// System.Text.Encoding.ASCII.GetString(line1_bytes[i]);
            index++;
        }
        System.out.println(output_str);
        //3.重新计算关键词的位置
        String res = "";
        for (int i = 0; i < keywords.length; i++) {
            if (keywords[i] == "" || keywords[i] == null) {
                break;
            }
            int pos = output_str.indexOf(keywords[i]);
            if (pos == -1) {
                break;
            }
            String key_out_end = "[";
            key_out_end += pos;
            key_out_end += ", ";
            key_out_end += pos + keywords[i].length() - 1;

            key_out_end += "]";
            res += key_out_end + ",";
        }
        System.out.println(res.substring(0, res.length() - 1));
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...