华为OD笔试题

华为OD笔试题


问题描述

输入两个整数m,n 输出1-m每个数字按顺时针螺旋且行数等于n的矩阵 数字不足部分用*补足


示例:
输入:3,5
输出:
1
2
3
*
*

输入:9,4
输出:
1	2	3	
*	*	4	
9	*	5	
8	7	6

代码

package com;

import java.util.Scanner;

public class Main1 {
    //case中需要使用final修饰的静态属性
    //输入两个整数m,n 输出1-m每个数字按顺时针螺旋且行数等于n的矩阵 数字不足部分用*补足

    //方向常量
    public static final int RIGHT = 0 ;
    public static final int DOWN = 1 ;
    public static final int LEFT = 2 ;
    public static final int UP = 3 ;


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //数字
        int n = in.nextInt();
        //矩阵行数
        int line = in.nextInt();
        //确定矩阵列数
        int col = n % line == 0 ? n/line : n/line+1;
        outPut(line,col,n);

    }
    //输出line * col 的矩阵,最大数字为num
    public static void outPut(int line , int col ,int num){
        //二维数组存储结果
        int[][] res = new int [line][col];
        //默认方向为右
        int to = RIGHT ;
        //初始位置为 x,y
        int x = 0 ;
        int y = 0 ;
        //当前需要填充的数字
        int cur = 1;
        while(cur <= num){
//            System.out.println("x="+x+" y="+y);
            res[x][y] = cur;
            //确定下一步的方向
            to = confirmTo(res,x,y,line,col,to);
            switch(to){
                case RIGHT:
                    y++;
                    break;
                case DOWN:
                    x++;
                    break;
                case LEFT:
                    y--;
                    break;
                case UP:
                    x--;
                    break;
                default:
            }
            cur++;
        }
        for(int i = 0 ; i < line ; i++){
            for(int j = 0 ; j < col ; j++){
                if(res[i][j] != 0  ){
                    System.out.print(res[i][j]+"\t");
                }else{
                    System.out.print("*" +"\t");
                }
            }
            System.out.println();
        }

    }

    //矩阵n*m 坐标x,y 当前方向to array回旋矩阵
    public static int confirmTo(int[][] array , int x , int y , int n , int m ,int to ){
        //根据当前方向及当前坐标位置确定下一步的方向
        //数组初始化为0  若下一位置值不为0 说明已经走过
        int res = to;
        if(to == RIGHT &&(y == m-1 || array[x][y+1] != 0 )){
            res = DOWN;
        }else if(to == DOWN && (x == n-1 || array[x+1][y]!=0 )){
            res = LEFT;
        }else if( to == LEFT && (y == 0 || array[x][y-1] != 0 )){
            res = UP;
        }else if(to == UP &&(x == 0 || array[x-1][y] != 0 )){
            res = RIGHT;
        }
        return res ;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD笔试题是关于使用动态规划解决工作报酬问题的。给定工作总时长t,工作数量n,工作时间数组time和工作报酬数组earnings,需要选择一些工作使得总时长不超过t,并且获得最大的报酬。 有两种解法可以解决这个问题。解法1是使用二维dp数组,解法2是使用一维dp数组进行优化。 解法1中,我们创建一个二维dp数组,dp\[i\]\[j\]表示在前i个工作中,总时长不超过j的情况下能获得的最大报酬。然后使用两层循环遍历工作和时长,根据状态转移方程dp\[i\]\[j\] = max(dp\[i-1\]\[j\], dp\[i-1\]\[j-time\[i-1\]\] + earnings\[i-1\])来更新dp数组。最后返回dp\[-1\]\[-1\]即为最大报酬。 解法2是对解法1的优化,使用一维dp数组。我们只需要保存上一行的dp值,然后从后向前遍历时长,根据状态转移方程dp\[j\] = max(dp\[j\], dp\[j-time\[i-1\]\] + earnings\[i-1\])来更新dp数组。最后返回dp\[-1\]即为最大报酬。 以上是关于华为OD笔试题的解答。 #### 引用[.reference_title] - *1* *3* [华为OD笔试题:工作安排 --- 100分 (思路+python代码)](https://blog.csdn.net/m0_69258561/article/details/130973186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【100%通过率】华为OD机试真题 Python 实现【分奖金】【2022.11 Q4 新题】](https://blog.csdn.net/misayaaaaa/article/details/128420154)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值