华为机试518

第一题:

1.1题目描述

一副扑克牌去掉大小王,数值大小为从1到13(1>13),花色大小为从4到1(1<4);
炸弹大于对子,对子大于单张,同样数值按花色大小排序
若一个数值有三张,则花色小的两张组成对子,花色大的组成单张
时间限制1000ms

输入:
第一行为扑克牌总数
后面每行为 “花色 大小”

输出:
按顺序,先输出所有炸弹,再输出所有对子,最后输出所有单张
例如:
1 2 炸弹
2 2
3 2
4 2
1 1 对1
3 1
4 1 单张1
1 3 单张3
3 6 单张6
4 13 单张13

1.2解题办法:

package com.example.bishi;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class cards {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        //10
        //1 4
        //2 4
        //3 4
        //4 4
        //2 3
        //4 3
        //1 7
        //2 7
        //3 7
        //1 1
        int nums=Integer.parseInt(sc.nextLine());
        String[] cards=new String[52];
        Map<Integer,Integer> hashtable=new TreeMap<Integer,Integer>();
        for(int i=0;i<nums;i++){
            String info=sc.nextLine();
            int color=Integer.parseInt(info.split(" ")[0]);
            int value=Integer.parseInt(info.split(" ")[1]);
            hashtable.put(value,hashtable.containsKey(value)?hashtable.get(value)+1:1);
            cards[(value-1)*4+color-1]=info;
        }
        for(Integer key: hashtable.keySet()){
            //System.out.println(key+":"+hashtable.get(key));
            if(hashtable.get(key)==4){
                for(int j=(key-1)*4;j<(key-1)*4+4;j++)
                {
                    System.out.println(cards[j]);
                    cards[j]=null;
                }

            }
        }
        for(Integer key: hashtable.keySet()){
            if(hashtable.get(key)==2||hashtable.get(key)==3){
                int count=0;
                for(int j=(key-1)*4;j<(key-1)*4+4;j++)
                {
                    if(cards[j]!=null&&count<2){
                        System.out.println(cards[j]);
                        cards[j]=null;
                        count++;
                    }
                }
            }
        }
        for(int k=0;k<cards.length;k++){
            if(cards[k]!=null){
                System.out.println(cards[k]);
            }
        }
    }
}

暴力求解,不知道正确率,考试的时候没有写出来。

第二题:

2.1题目描述

输入:
1行: “m n”,m为地图行数,n为地图列数
2~m+1行 长度为n的字符串,为每格地形
m+2行: ‘x y’,x为宝藏初始横坐标,y为宝藏初始纵坐标
m+3行: “number” 行动次数

时间限制2000ms
字符串有六种字符,各自为
'.'空地,到达此处后不会再更改位置
'#'障碍,无法到底此处,若目的地障碍处则不移动
'^'向上走
'v'向下走
'<'向左走
'>'向右走
宝藏不会超出边界,若下一步超出边界则停留在原位置

输出:
宝藏最终位置

例:

输入

"3 4"

">>v."
">v<>"
"#.><"

"0 0"
"10000"
输出:
2 1

2.2解题思路

以下是我考试的时候的代码,通过率仅仅45%。给出的测试数据,都过了,但是后台智能通过45%。导致我一直在想哪儿有错,最后时间都花在这个上面。有大佬有好的解法,希望能分享给我一下。

我最开始的代码,没有闭环,完全模拟,通过率是15%。后来加了><这种相连的情况,变成了45%。一直在那儿思考,闭环的情况怎么做。

import java.util.*;

public class kaoshi {

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String[] nums=sc.nextLine().split(" ");
        int n=Integer.parseInt(nums[0]);
        int m=Integer.parseInt(nums[1]);
        char[][] dp=new char[n][m];
        for(int i=0;i<n;i++){
            char[] strs=sc.nextLine().toCharArray();
            for(int j=0;j<m;j++){
                dp[i][j]=strs[j];
            }
        }
        String[] start=sc.nextLine().split(" ");
        int starti=Integer.parseInt(start[0]);
        int startj=Integer.parseInt(start[1]);
        int k=sc.nextInt();
        while(k>0){
            //空地
            if(dp[starti][startj]=='.'){
                System.out.println(starti+" "+startj);
                break;
            }
            //上
            else if(dp[starti][startj]=='^'){
                if(starti-1<0){
                    System.out.println(starti+" "+startj);
                    break;
                } else if(dp[starti-1][startj]=='#'){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti][startj-1]=='v'){
                    if(k%2==0){
                        System.out.println(starti+" "+startj);
                        break;
                    }else{
                        System.out.println((starti-1)+" "+startj);
                        break;
                    }
                }else{
                    starti--;
                    k--;
                }
            }
            //下
            else if(dp[starti][startj]=='v'){
                if(starti+1>n-1){
                    System.out.println(starti+" "+startj);
                    break;
                } else if(dp[starti+1][startj]=='#'){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti+1][startj]=='^'){
                    if(k%2==0){
                        System.out.println(starti+" "+startj);
                        break;
                    }else{
                        System.out.println((starti+1)+" "+startj);
                        break;
                    }
                }
                else{
                    starti++;
                    k--;
                }
            }
            //左
            else if(dp[starti][startj]=='<'){
                if(startj-1<0){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti][startj-1]=='#'){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti][startj-1]=='>'){
                    if(k%2==0){
                        System.out.println(starti+" "+startj);
                        break;
                    }else{
                        System.out.println(starti+" "+(startj-1));
                        break;
                    }
                }
                else{
                    startj--;
                    k--;
                }
            }
            //右
            else if(dp[starti][startj]=='>'){
                if(startj+1>m-1){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti][startj+1]=='#'){
                    System.out.println(starti+" "+startj);
                    break;
                }else if(dp[starti][startj+1]=='<'){
                    if(k%2==0){
                        System.out.println(starti+" "+startj);
                        break;
                    }else{
                        System.out.println(starti+" "+(startj+1));
                        break;
                    }
                } else{
                    startj++;
                    k--;
                }
            }
        }
        if(k==0){
            System.out.println(starti+" "+startj);
            return;
        }
    }
}

第三题:

3.1题目描述:

名字匹配
zhang xu,Zhang xu xu,zhaxu
与zhx匹配
匹配成功的是zhang xu

输入:
第一行:所有联系人,逗号分割,"zhang han,zhang san,zhang han su"
第二行:目标联系人缩写"zhs"

输出:符合第二行字符缩写的联系人。如“zhang san”(zh+s) “zhang han su”(z+h+s)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值