华为OD-2022-05-16机试题

前言:本次机试题目总体水平不难,但我还记录下自己的成长吧

大体记不住了,只记得第一题和第三题简单点,第二题我到现在还没看懂题意,后期会补充

1、去重(这个是在hr给的往届题有)

od历年真题:http://www.amoscloud.com/?cat=57
(我真不知道od是外包,但是考研调剂失败后,第一次投,有回复就先去试试水)

问题详情

游戏规则:
输入一个只包含英文字母的字符串,
字符串中的两个字母如果相邻且相同,就可以消除。
在字符串上反复执行消除的动作,
直到无法继续消除为止,此时游戏结束。
输出最终得到的字符串长度.

输入描述:

输入原始字符串str
只能包含大小写英文字母,字母的大小写敏感,
str长度不超过100

输出描述

输出游戏结束后,最终得到的字符串长度

示例一:

输入

gg

输出

0
说明 gg可以直接消除 得到空串 长度为0

示例2

输入:

mMbccbc
0123456

输出

3
0
说明mMbccbc中 可以先消除cc 此时变为mMbbc
再消除 bb 此时变成mMc
此时没有相同且相邻的字符 无法继续消除
最终得到字符串mMc  长度为3

备注:
输入中包含非大小写英文字母时
均为异常输入
直接返回0

通过100%的答案

/**
 * Created with IntelliJ IDEA.
 *
 * @author 广大菜鸟
 * @date 2022/5/16
 * @Time 13:58
 * E-mail: 1456084073@qq.com
 */
import java.util.*;
public class Main {
    public static void main(String[]args){
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine().trim();
        scanner.close();
        if(line.replaceAll("[a-zA-Z]","").length()>0){
            System.out.println(0);
            return;
        }
        List<Character>lst = new ArrayList<>();
        
        for(char ch:line.toCharArray()){
          lst.add(ch);
        }

        for(int i=0;i<lst.size();){
            if(i+1<lst.size() && lst.get(i).equals(lst.get(i + 1))){
                lst.remove(i+1);
                lst.remove(i);
                i -= 1;
                i = Math.max(0,i);
            }else{
                i++;
            }
        }

        System.out.println(lst.size());

    }
}

2、顺子

顺子:由至少 5 张由小到大连续递增 的扑克牌组成,不能有大小王、2 。

这个答案应该不对(16%)

/**
 * Created with IntelliJ IDEA.
 *
 * @author 广大菜鸟
 * @date 2022/5/16
 * @Time 13:58
 * E-mail: 1456084073@qq.com
 */
import java.util.*;
import java.util.stream.Collectors;

public class Main {

    private static HashMap<String, Integer> map = null;


    public static void main(String[]args)  {
        Scanner scanner = new Scanner(System.in);
        List<String>inHand = Arrays.stream(scanner.nextLine().trim().split("-"))
                .collect(Collectors.toList());
        List<String>hasPass =  Arrays.stream(scanner.nextLine().trim().split("-"))
                        .collect(Collectors.toList());
        scanner.close();

        initRole();

        //规则:顺子:不能有大小王、2
        while(inHand.contains("2")) {
            inHand.remove("2");
        }
        while (inHand.contains("B")){
            inHand.remove("B");
        }
        while (inHand.contains("C")){
            inHand.remove("C");
        }

        //逆序
        inHand.sort((o1,o2)-> map.get(o2) - map.get(o1));

        hasPass.sort((o1,o2)-> map.get(o2) - map.get(o1));

        int lenOfInHand = inHand.size();
        int lenOfHasPass = hasPass.size();

        if(lenOfInHand<lenOfHasPass){
            System.out.println("NO-CHAIN");
            return;
        }


        String otherHighCode = hasPass.get(0);
        int otherHighScore = map.get(otherHighCode);
        List<String>stringList = new ArrayList<>();
        for (String myHighCode : inHand) {
            if (otherHighScore >= map.get(myHighCode)) {
                break;
            }
            stringList.add(myHighCode);
        }

        if(stringList.size()==0){
            System.out.println("NO-CHAIN");
            return;
        }

        StringBuilder sb = new StringBuilder();
        for(int i=stringList.size()-1;i>=0;i--){
            sb.append(stringList.get(i)).append("-");
        }
        System.out.println(sb.substring(0,sb.length()-1));
    }

    private static void initRole (){
      map = new HashMap<>(15);
      int i,k=0;
      for(i=3;i<=10;i++){
          map.put(i+"", k++);
      }
      map.put("J", k++);
      map.put("Q", k++);
      map.put("K", k++);
      map.put("A", k++);
      map.put("2",k++);
      map.put("B",k++);
      map.put("C",k);
    }
}

3、还原字符串

大致题意是 3[a] 还原成aaa

通过100%的答案

/**
 * Created with IntelliJ IDEA.
 *
 * @author 广大菜鸟
 * @date 2022/5/16
 * @Time 13:58
 * E-mail: 1456084073@qq.com
 */
import java.util.*;
public class Main {
    public static void main(String[]args)  {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine().trim();
        scanner.close();
        System.out.println(solution(line));
    }

    private static String solution(String line)  {
        int s = line.indexOf("[");
        if(s==-1){
            return line;
        }
        Deque<Integer>deque = new ArrayDeque<>();

        for(int i=0;i<line.length();i++){
           if(line.charAt(i)=='['){
               deque.addFirst(i);
           }
           else if(line.charAt(i)==']'){
               s = deque.pop();
               int e = i;

               int num ;
               StringBuilder numSb = new StringBuilder();
               int j;
               for(j=s-1;j>=0;j--){
                   if(Character.isDigit(line.charAt(j))){
                       numSb.append(line.charAt(j));
                   }else{
                        break;
                   }
               }
               num = Integer.parseInt(numSb.reverse().toString());

               String newString = addSameString(line.substring(s+1, e), num);
               line = line.substring(0, j+1) + newString + line.substring(i+1);
               i = j+newString.length();
           }
        }
        return line;
    }

    private static String addSameString(String str,int digit){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<digit;i++){
            sb.append(str);
        }
        return sb.toString();
    }

}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

广大菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值