机试算法学习

news2024/11/24 14:54:34

又到了一年一度的校招干饭环节,本人不得已以应届生的身份卷入了这场洪流,让我们各自加油吧!

蛇形矩阵

xx机考编程题

题目描述

输入两个整数 n和 m,输出一个 n 行 m 列的矩阵,将数字 1到 n×m按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

输入共一行,包含两个整数 n 和 m。

输出格式

输出满足要求的矩阵。

矩阵占 n 行,每行包含 m 个空格隔开的整数。

数据范围

1≤n,m≤100

解法

模拟法:

思路:

  1. 导入Java的Scanner类,以便从标准输入中获取用户输入。

  2. main 方法中,首先通过 Scanner 获取输入的两个整数 nm,分别表示矩阵的行数和列数。

  3. 创建一个二维数组 a,用于存储填充后的矩阵。

  4. 初始化四个边界指针:l(左边界)、r(右边界)、t(上边界)、d(下边界),并初始化计数器 cnt 为 1。

  5. 使用一个循环,当 l <= rt <= d 时,进行如下操作,这是一个螺旋填充的核心逻辑:

    • 从左到右,填充第 t 行,列从 lr
    • 递增 t,缩小上边界。
    • 从上到下,填充第 r 列,行从 td
    • 递减 r,缩小右边界。
    • 从右到左,填充第 d 行,列从 rl
    • 递减 d,缩小下边界。
    • 从下到上,填充第 l 列,行从 dt
    • 递增 l,扩大左边界。
  6. 在循环结束后,矩阵 a 中已经填充完毕。

  7. 使用嵌套的循环遍历矩阵 a,并使用 System.out.print 打印每个元素,每行元素之间用空格分隔,每行结束时用 System.out.println 换行。

总体思路是通过四个指针和循环实现螺旋填充,将数字从1递增填充到矩阵中的各个位置。这种方法可以确保按照螺旋的方式填充矩阵,最终输出完整的螺旋矩阵。

代码:

package com.company;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] a = new int[n][m];
        int l = 0, r = m - 1, t = 0, d = n - 1, cnt = 1;
        while (l <= r || t <= d) {
            for (int i = l; i <= r && t <= d; i++) a[t][i] = cnt++;
            t++;
            for (int i = t; i <= d && l <= r; i++) a[i][r] = cnt++;
            r--;
            for (int i = r; i >= l && t <= d; i--) a[d][i] = cnt++;
            d--;
            for (int i = d; i >= t && l <= r; i--) a[i][l] = cnt++;
            l++;
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }
}

测试结果:

触底模拟:

思路:

  1. 导入Java的Scanner类,以便从标准输入中获取用户输入。

  2. main 方法中,首先通过 Scanner 获取输入的两个整数 nm,分别表示矩阵的行数和列数。

  3. 创建一个二维数组 a,用于存储填充后的矩阵。

  4. 定义两个数组 dxdy,分别表示四个方向的水平和垂直移动。例如,dx[0]dy[0] 表示向右移动,dx[1]dy[1] 表示向下移动,以此类推。

  5. 初始化变量 xy,表示当前位置的行和列,以及变量 u,表示当前的方向。

  6. 使用一个循环,从1到 n * m 遍历填充矩阵的数字。循环内部的操作如下:

    • 将当前位置 (x, y) 填充为当前数字 i
    • 根据当前方向 u 计算下一个位置 (newX, newY)
    • 检查下一个位置是否越界或已经被填充,如果是,则更改方向 u 为下一个方向,并重新计算新的位置 (newX, newY)
    • 更新当前位置 (x, y) 为新的位置 (newX, newY)
  7. 循环结束后,矩阵 a 中已经填充完毕。

  8. 使用嵌套的循环遍历矩阵 a,并使用 System.out.print 打印每个元素,每行元素之间用空格分隔,每行结束时用 System.out.println 换行。

总体思路是通过四个方向的移动来实现螺旋填充,将数字从1递增填充到矩阵的各个位置。在填充过程中,根据当前方向和位置的情况来判断是否需要更改方向,以确保按照螺旋的方式填充矩阵。最终输出完整的螺旋矩阵。

代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] a = new int[n][m];
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};
        int x = 0, y = 0, u = 0;

        for (int i = 1; i <= n * m; i++) {
            a[x][y] = i;
            int newX = x + dx[u];
            int newY = y + dy[u];

            if (newX < 0 || newY < 0 || newX >= n || newY >= m || a[newX][newY] != 0) {
                u = (u + 1) % 4;
                newX = x + dx[u];
                newY = y + dy[u];
            }

            x = newX;
            y = newY;
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }
}

输入测试:

单链表快速排序

旷视面试题

题目描述

给定一个单链表,请使用快速排序算法对其排序。

要求:期望平均时间复杂度为 O(nlogn),期望额外空间复杂度为 O(logn)。

思考题: 如果只能改变链表结构,不能修改每个节点的val值该如何做呢?

数据范围

链表中的所有数大小均在 int 范围内,链表长度在 [0,10000]。
本题数据完全随机生成。

解法

思路与普通的快排基本一致,将链表根据一个val分成小于val、等于val、大于val三段,再对前后两段递归进行快排,对于排序完的三段从前到后进行拼接即可完成。

代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] result = generateSpiralMatrix(n, m);

        // 打印生成的螺旋矩阵
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(result[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static int[][] generateSpiralMatrix(int n, int m) {
        int[][] matrix = new int[n][m];
        int top = 0, bottom = n - 1, left = 0, right = m - 1;
        int num = 1;

        while (num <= n * m) {
            for (int i = left; i <= right && num <= n * m; i++) {
                matrix[top][i] = num++;
            }
            top++;

            for (int i = top; i <= bottom && num <= n * m; i++) {
                matrix[i][right] = num++;
            }
            right--;

            for (int i = right; i >= left && num <= n * m; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;

            for (int i = bottom; i >= top && num <= n * m; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }

        return matrix;
    }
}

输入测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前段基础入门之】=>HTML 标签元素

前言&#xff1a; 在前一章节中&#xff0c;我们讲解认识了&#xff0c;HTML 的概念&#xff0c;以及它的标准文档结构&#xff0c;所以本章节就带来 HTML 学习的第二步&#xff0c;学习了解HTML 的排版标签元素。 文章目录 文档排版标签元素语义化标签块级元素与行内元素文本标…

Linux桌面环境中应用程序无法启动图形交互界面

现象&#xff1a; 点击永中office或者金山office快捷图标无法启动对应的程序。 从命令行执行对应的程序则提示 按照提示安装组件 再次执行命令行程序 原因探析&#xff1a; /opt/Yozosoft/Yozo_Office/Yozo_Writer.bin: error while loading shared libraries: libgdk-x11-2.0.…

SQL 如何提取多级分类目录

前言 POI数据处理&#xff0c;原始数据为csv格式&#xff0c;整理入库至PostGreSQL&#xff0c;本例使用PostGreSQL13版本。 一、POI POI&#xff08;一般作为Point of Interest的缩写&#xff0c;也有Point of Information的说法&#xff09;&#xff0c;通常称作兴趣点&am…

Cloudflare分析第一天:简单的算法反混淆

记录1&#xff1a; Cloudflare 加密方式为动态JS&#xff0c;每次请求JS文件都会变化&#xff0c;笨方式&#xff0c;先复制一份出来分析看&#xff01; 原JS: window._cf_chl_opt.uaSR true; window._cf_chl_opt.uaO false; function(ia, fy, fz, fA, fB, fC, fM, fV, fW…

Windows 11 家庭中文版添加本地安全策略

一、报错 Windows11中打开本地组策略编辑器(cmd中输入gpedit.msc)&#xff0c;报错&#xff1a; 二、解决 1、新建txt文件&#xff0c;文件名任意&#xff0c;将下面的内容复制粘贴进去。2、将文件后缀名由txt改为cmd。3、以管理员身份执行该cmd文件&#xff0c;安装本地安全…

java Spring Boot生成图片二维码

首先 我们要引入依赖 pom.xml中插入 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version> </dependency> <dependency><groupId>com.google.zxing</grou…

Jetpack Compose 的简单 MVI 框架

Jetpack Compose 的简单 MVI 框架 在 Jetpack Compose 应用程序中管理状态的一种简单方法 选择正确的架构是至关重要的&#xff0c;因为架构变更后期代价高昂。MVP已被MVVM和MVI取代&#xff0c;而MVI更受欢迎。MVI通过强制实施结构化的状态管理方法&#xff0c;只在reducer中…

Linux 快捷键

1、快捷键小操作 1.1、ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2、ctrl d 退出或登出 可以通过快捷键&…

使用Mybatis generator自动生成代码,仅限Oracle数据库

一、使用Mybatis generator自动生成代码&#xff0c;仅限Oracle数据库 使用Mybatis generator自动生成代码&#xff0c;仅限Oracle数据库 一、在pom.xml文件中引入所需要的依赖和插件 <dependency><groupId>org.mybatis.generator</groupId><artifactI…

VUE日期只选择日月,表格导入功能,表格下载模版功能

1.日期选择日月&#xff1a;参考https://blog.csdn.net/Oct_Somnus/article/details/129989865?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129989865-blog-116654979.235%5Ev38%5Epc_relevant_sort_b…

轻松使用androidstudio交叉编译libredwg库

对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…

Java 21 / JDK 21 (LTS) GA

Java 21 / JDK 21 已正式 GA&#xff0c;此版本是继 JDK 17 后的长期支持版本 (LTS)&#xff0c;Oracle 将为其提供至少八年的技术支持和更新。 本版本是Java SE平台21版的参考实现&#xff0c;由Java社区流程中的JSR 396指定。 正式稳定功能 JEP 444&#xff1a;虚拟线程JEP…

测试C#图像文本识别模块Tesseract的基本用法

微信公众号“dotNET跨平台”的文章《c#实现图片文体提取》&#xff08;参考文献3&#xff09;介绍了C#图像文本识别模块Tesseract&#xff0c;后者是tesseract-ocr&#xff08;参考文献2&#xff09; 的C#封装版本&#xff0c;目前版本为5.2&#xff0c;关于Tesseract的详细介绍…

windows上搭建llama小型私有模型

导言 llama官网是需要多读读的 openAI的付费&#xff0c;让学习LLM的成本不可控。为了省钱&#xff0c;搭建本地LLAMA模型 我的笔记本是近10年前买的配置一般的windows 目标 本地llm可以运行使用llama-cpp-python调用本地llm使用langchain/openai调用本地llm 需要重点说下&…

ESP8266 WiFi物联网智能插座—上位机和下位机通信协议

目录 1、配置节点协议 2、控制节点继电器开关协议 3、节点周期上报数据协议 4、升级节点协议 5、重启节点 本项目自定义了一套上位机和下位机通信协议&#xff0c;协议并不复杂&#xff0c;包含&#xff1a;配置节点、控制节点继电器开关、节点周期上报数据、升级节点和重启节点…

设计模式篇---桥接模式

文章目录 概念结构实例总结 概念 桥接模式&#xff1a;将抽象部分与它的实现部分解耦&#xff0c;使得两者都能够独立变化。 毛笔和蜡笔都属于画笔&#xff0c;假设需要有大、中、小三种型号的画笔&#xff0c;绘画出12种颜色&#xff0c;蜡笔需要3*1236支&#xff0c;毛笔需要…

大数据之Flume

Flume概述 一个高可用&#xff08;稳定&#xff09;&#xff0c;高可靠&#xff08;稳定&#xff09;&#xff0c;分布式的海量日志采集&#xff0c;聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。日志文件即txt文件&#xff0c;不能传输音频&#xff0c;视频&am…

【狼疮抗凝物-- 抗心磷脂抗体】

狼疮抗凝物属于易栓症的一种. 狼疮抗凝物 &#xff08;Lupus Anticoagulant LAC&#xff09;是一种作用于磷脂的IgG或IgM的抗磷脂抗体&#xff0c;在体内和体外 凝血试验中&#xff0c;磷脂对凝血酶原酶复合体活化起模板作用。狼疮抗凝物是抗磷脂的成分的抗 体&#xff0c;在多…

消息队列中,如何保证消息的顺序性?

本文选自&#xff1a;advanced-java 作者&#xff1a;yanglbme 问&#xff1a;如何保证消息的顺序性&#xff1f; 面试官心理分析 其实这个也是用 MQ 的时候必问的话题&#xff0c;第一看看你了不了解顺序这个事儿&#xff1f;第二看看你有没有办法保证消息是有顺序的&#xf…

大范围XSS扫描工具:XSS-Freak,BurpSuite随机用户代理,Hades 静态代码审核系统

大范围XSS扫描工具&#xff1a;XSS-Freak&#xff0c;BurpSuite随机用户代理&#xff0c;Hades 静态代码审核系统。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习…