秋招突击——笔试总结——8/31——京东笔试

news2024/9/24 3:25:13

文章目录

    • 引言
    • 正文
      • 第一题——下一个字典序的字符
        • 个人实现
      • 第二题——冒泡排序的变种
        • 个人实现
        • 空间复杂度比较低的版本
      • 第三题——两人走路
        • 个人实现
    • 总结

引言

  • 今天京东笔试做的并不好,有很多问题的关窍都没有找到,所以在很多问题上都浪费了大量的时间!今天看了很多做法,来这里整理一下!

正文

第一题——下一个字典序的字符

个人实现
  • 这个题目就是单纯使用对应类似二十六进制的字符进行运算,然后在进行取余进位,但是要防止越界!
import javax.crypto.Cipher;
import java.util.*;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.next();
            char[] chars = str.toCharArray();
            int addNum = 1;
            for(int i = chars.length - 1;i >=0 ;i --){
                chars[i] = (char)(chars[i] + addNum);
                if(chars[i] > 'z' ){
                    addNum = 1;
                    chars[i] = 'a' ;
                }else{
                    addNum = 0;
                }
            }

            // 判定是否存在不存在下一个字典序列
            if (addNum == 1){
                System.out.println(-1);
            }else{
                System.out.println(new String(chars));
            }

        }
    }

}

在这里插入图片描述
注意

  • 这个比较特殊是,az的字典序列下一个是ba,不是bz,这里需要重新弄一下
  • 整理一下代码,写起来比之前好很多了,不至于那么费劲了!

第二题——冒泡排序的变种

个人实现
  • 这里定义了两种操作,一种是正常的冒泡排序,然后交换两个元素,还有一种是三个元素abc,然后交换最外侧的两个元素。具体流程如下
  • 题目要求使用最少的操作一去实现,然后给你讲了一个冒泡排序的方式,来误导你!
    在这里插入图片描述
  • 这个时候有两种思维方式
    • 方式一:按照题目的提示来,完全按照冒泡排序实现,只不过两个元素改成了三个元素
    • 方式二:从整体考虑,纵观一下操作一和操作二的区别

方式一:纯冒泡思考

  • 我就是一开始按照题目的诱导实现了纯冒泡排序,然后陷入了一个泥沼,因为对于三个元素,你需要比较一下应该采取那种方式操作更加划算
  • 具体应对下述六种情况,每一种情况都需要进行处理,然后计算对应的操作一和操作二的数目,这个还是太浪费时间了,完全没有必要,而且写起来很费劲!我一开始是按照这个写的,但是写到后面发现要处理的情况太多了,整不过来了!
    在这里插入图片描述

方式二:整体序列考虑

  • 这个方式是我在牛客网上看别人的思路分析想出来的,自己当时没想到。
  • 操作二仅能操作同为奇数的元素,或者同为偶数的元素,然后对其进行交换顺序,具体见下图
    • 连续执行若干次操作二之后,可以发现,整个序列被分成了两部分,一部分是红色元素,还有一部分是蓝色元素,在仅仅执行操作二的情况下,怎么样都不能的交互到一块去!

在这里插入图片描述

  • 执行若干次操作二的时候,仅仅可以保证两个分开的序列是单调递增的,但是最终的是要求两个序列合并在一块是单调递增的,只能通过操作二,交换对应序列的值才能实现。

在这里插入图片描述

  • 只能 执行一次操作一之后,在保证在自己的序列里面保证有序就行!

在这里插入图片描述

  • 借此统计出对应的操作数关系,如果奇数序列和偶数序列都是最终的元素,那么仅仅执行操作二就能有序,如果有不一样的,就需要执行操作一,保证有序。
  • 最终又不需要输出有序序列,仅仅是要求执行最少的操作二的次数,具体实现如下
import javax.crypto.Cipher;
import java.util.*;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] nums = new int[n];
            for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
            int[] numsSorted = Arrays.copyOfRange(nums, 0, n);

            // 直接对原来的元素进行排序,然后再计算对应的数据就行
            Arrays.sort(numsSorted);
            Map<Integer,Integer> map1 = new HashMap<>(); // 保存奇数序列的元素
            Map<Integer,Integer> map2 = new HashMap<>(); // 保存偶数序列的元素
            for (int i = 0; i < n; i++) {
                if (i % 2 == 0) {
                    map2.put(numsSorted[i], map2.getOrDefault(numsSorted[i], 0) + 1);
                }else {
                    map1.put(numsSorted[i], map1.getOrDefault(numsSorted[i], 0) + 1);
                }
            }

            // 计算原始的序列
            int oper1 = 0;
            for (int i = 0; i < n; i++) {
                if (i % 2 == 0) {
                    if(!map2.containsKey(nums[i])){
                        oper1 ++;
                    }
                }
            }
            System.out.println(oper1);
        }
    }

}

在这里插入图片描述

空间复杂度比较低的版本
  • 如果不能像上面一样取巧的话,正常应该是先对其进行操作三的排序,然后在对其进行操作二的排序纠正。
  • 这里操作一的执行逻辑感觉还是比较复杂的,因为还需要掺杂着执行操作二,想想看,具体问题如下

在这里插入图片描述

  • 这里是局部有序性的,所以只需要保证结果,所以只需要保证各自序列的最小值是按照序列排序的就行了,后续在再确定一次就行!
import javax.crypto.Cipher;
import java.util.*;

public class Main {

    public static void oper2Sort(int[] nums) {
        // 使用操作三,类冒泡泡排序
        int n = nums.length;
        for (int i = n - 1; i >= 0; i--) {
            for (int j = 2; j <= i; j++) {
                if (nums[j] < nums[j - 2]) {
                    int temp = nums[j];
                    nums[j] = nums[j - 2];
                    nums[j - 2] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] nums = new int[n];
            for (int i = 0; i < n; i++) nums[i] = sc.nextInt();

            // 使用操作三,类冒泡泡排序
            oper2Sort(nums);

            System.out.println(Arrays.toString(nums));
            int oper1Num = 0;
            boolean ordered = false;
            while (!ordered) {
                ordered = true;
                for (int i = 1; i < n; i++) {
                    if (nums[i] < nums[i - 1]) {
                        int temp = nums[i];
                        nums[i] = nums[i - 1];
                        nums[i - 1] = temp;
                        oper1Num++;
                        oper2Sort(nums);
                        ordered = false;
                    }
                }
            }

            System.out.println(Arrays.toString(nums));
            System.out.println(oper1Num);

        }
    }

}

总结

  • 上述方法存在超时问题,还是得采用取巧的方法,不然我找不到其他合适的方法去计算对应的值了
  • 除非还是像之前一样,排个序,看一下当前索引是来自奇数还是偶数,类似两个数组合并,不过还需要创建一个新的数组才行!

第三题——两人走路

  • 给一个2行N列的矩阵A,从左上角出发到右下角,然后可以向上、向下、向右移动,不重复访问每一个方格,
  • 两个人轮流选一个方格,默认第一个玩家已经选了(1,1),直到路径到达终点的时候,路径停止!
  • 路径的定义是所有方格上的数字的综合,第一个玩家想最大路径的成本,第二个玩家想最小化路径的成本,每个人都是选择最优的决策。
  • 最后的路径成本将是多少。
个人实现
  • 这里dfs的时候比较特殊,需要转换状态进行dfs,不是当前状态再找最优的情况,但是下面这个代码,再牛客上看了很多,发现不能通过所有样例,这里得记录一下状态,但是状态记录比较费劲了,并不知道怎么能够快速匹配到对应的状态!
import java.util.*;

public class Main {
    static int N;
    static int[][] grid;
    static boolean[][] visited;
    static int cost = 0;
    static boolean big = true;
    static boolean small = false;

    static int[][] DIRECTIONS = {{0, 1}, {1, 0}, {0, -1}};

    public static int[] dfs(int x, int y, boolean status, int cost) {
        // 终止条件
        if (x == 2 && y == N) {
            return new int[]{x, y, cost};
        }

        int resX = 0;
        int resY = 0;
        int resCost = status == big ? Integer.MIN_VALUE : Integer.MAX_VALUE;
        for (int[] dir : DIRECTIONS) {
            int nextX = x + dir[0];
            int nextY = y + dir[1];
            if (nextX >= 1 && nextX <= 2 && nextY >= 1 && nextY <= N && !visited[nextX][nextY]) {
                visited[nextX][nextY] = true;
                int[] temp = dfs(nextX, nextY, !status, cost + grid[nextX][nextY]);
                if ((status == big && resCost <= temp[2])
                        || (status == small && resCost >= temp[2])) {
                    // 如果相等的情况下,默认是选择能够让对方获得分最小的情况
                    resCost = temp[2];
                    resX = nextX;
                    resY = nextY;
                }
                // 恢复现场
                visited[nextX][nextY] = false;
            }
        }
        return new int[]{resX, resY, resCost};
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            N = sc.nextInt();
            grid = new int[3][N + 1];
            for (int i = 1; i <= 2; i++) {
                for (int j = 1; j <= N; j++) {
                    grid[i][j] = sc.nextInt();
                }
            }

            // 第一个点已经访问过了
            visited = new boolean[3][N + 1];
            visited[1][1] = true;
            cost = grid[1][1];

            // 构建对应的游戏
            int curX = 1, curY = 1;
            visited[curX][curY] = true;
            int[] pos = dfs(curX, curY, small, grid[curX][curY]);
            System.out.println(pos[2]);
        }
    }
}

在这里插入图片描述

状态记录

  • 这里是使用两个字典来记录各自对应的最优状态,key是对应状态下string字符串来表示,之前都是使用位图来表示的,这个没有办法使用位图表示。但是同一个步骤会有不同的情况,所以要使用map来记录对应的状态记录,然后所见运行空间
  • 1表示已经访问过
  • 0表示没有访问过
  • 2表示当前的点
  • value表示下一步的方向

不行,忽然间觉得如果按照我这样的方式进行状态记录,太费时间了,先这样吧!

总结

  • 废了九牛二虎之力,终于总结完了笔试,做的不好,还需要再练习!继续加油吧!感觉智力题居多,并没有像其他很多题目一样,会考一些常规的算法思想!

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

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

相关文章

JVM下篇:性能监控与调优篇-04-JVM运行时参数

文章目录 4. JVM 运行时参数4.1. JVM 参数选项4.1.1. 类型一&#xff1a;标准参数选项4.1.2. 类型二&#xff1a;-X 参数选项4.1.3. 类型三&#xff1a;-XX 参数选项 4.2. 添加 JVM 参数选项4.3. 常用的 JVM 参数选项4.3.1. 打印设置的 XX 选项及值4.3.2. 堆、栈、方法区等内存…

Java多线程(二)线程同步

1、线程同步问题 当多个线程同时操作同一个数据时&#xff0c;就会产生线程同步问题。 为了确保在任何时间点一个共享的资源只被一个线程使用&#xff0c;使用了“同步”。当一个线程运行到需要同步的语句后&#xff0c;CPU不去执行其他线程中的、可能影响当前线程中的下一句代…

记一次学习--webshell绕过(动态检测)

目录 第一种样本 代码分析 第二种样本 代码分析 题目分析 结果 不断学习&#xff0c;不断进步 快就是慢&#xff0c;慢就是快。审视自身 第一种样本 <?php class xxxd implements IteratorAggregate {public $xxx "system";public function __construct(…

C++ | Leetcode C++题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; class Solution { public:int lengthLongestPath(string input) {int n input.size();int pos 0;int ans 0;vector<int> level(n 1);while (pos < n) {/* 检测当前文件的深度 */int depth 1;while (pos < n && in…

R语言统计分析——单因素协方差分析

参考资料&#xff1a;R语言实战【第2版】 单因素协方差分析&#xff08;ANCONA&#xff09;扩展了单因素方差分析&#xff08;ANOVA&#xff09;&#xff0c;包含一个或多个定量的协变量。下面使用multcomp包中的litter数据集进行操作&#xff1a; # 加载数据集 data(litter,p…

0-HDMI高速接口协议基础介绍

高清多媒体接口(HDMI&#xff0c;High Definition Multimedia Interface)是一种数字化视频/音频接 口技术&#xff0c;是适合影像传输的专用型数字化接口&#xff0c;其可同时传送音频和视频信号&#xff0c;同时无需在 信号传送前进行数/模或者模/数转换。从2002年HDMI发布最初…

Windows 环境nginx安装使用及目录结构详解

一、 Windows 环境nginx安装及基本使用 1、下载 nginx-1.27.1 最新的主线版本 安装 nginx/Windows&#xff0c;请下载1.27.1最新的主线版本&#xff0c; nginx 的主线分支包含所有已知的修复程序。 2、 解压缩 nginx-1.27.1 版本 nginx/Windows 作为标准控制台应用程序&#x…

YOLO | YOLO目标检测算法(分类、检测、分割)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 分类、检测、分割 思考&#xff1a;计算机视觉能够解决哪些问题&#xff1f;&#xff1f;&#xff1f;&#xff1f;分类、检测、分割 分割&#xff1a;语义分割和实例分…

SOMYO™——将“照片”转为“手绘素描”的专业级软件

一定要往下看&#xff0c;最精彩的在最后哦&#xff01; 1 关于素描的几句话 素描是西方美术的灵魂。值得为自己、亲人与好友留下一张别致的素描。 素描的定义&#xff1a;艺术家通过线条的粗细、浓淡、疏密等变化&#xff0c;试图精准地再现形态的体感、质感和动感的艺术…

轻量级进程(LWP)和线程

线程是CPU调度的基本单位 进程是承担系统资源的基本实体(进程是资源分配的基本单位) 线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配 任何一个线程都可以创建或撤销另一个线程 多进程里&#xff0c;子进程可复制父进程的所有堆和栈的数据&#xff1b…

黑神话悟空-提高画质、防卡顿、修复等各种功能、各种CT表、各种存档、武器包、人物、装备替换等193+MOD合集

193MOD合集&#xff0c;提高画质&#xff0c;减少卡顿、修复等功能MOD各种CT表各种存档武器包、物品、人物、装备、造型替换等 具体MOD可在文件内查看 特别说明&#xff1a;3款珍品大圣套装替换初始套装MOD是不同的&#xff0c;&#xff08;其中全装备珍品大圣套装是不可以跳出…

笔记 12 : 彭老师课本第 6 章, PWM ,代码实践

&#xff08;85&#xff09; 驱动写多了&#xff0c;会发现&#xff0c;首先就是硬件的初始化&#xff0c;配置硬件。 &#xff08;86&#xff09;查看源代码组织&#xff1a; &#xff08;87&#xff09; 编译过程不变&#xff1a; &#xff08;88&#xff09; 运行同以前的步…

2024年8月总结及随笔之逝

1. 回头看 日更坚持了609天。 读《零信任网络&#xff1a;在不可信网络中构建安全系统》更新完成读《软件开发安全之道&#xff1a;概率、设计与实施》开更并持续更新 2023年至2024年8月底累计码字1463007字&#xff0c;累计日均码字2402字。 2024年8月码字109278字&#x…

全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型

全网最适合入门的面向对象编程教程&#xff1a;42 Python 常用复合数据类型-collections 容器数据类型 摘要&#xff1a; 在 Python 中&#xff0c;collections 模块提供了一组高效、功能强大的容器数据类型&#xff0c;扩展了内置的基础数据类型&#xff08;如 list、tuple、…

ubuntu14.04.5出现配环境后重启进不了图形化界面解决记录

前言 这段时间给公司接了一个需要使用到linux环境进行交叉编译的工程&#xff0c;就采用了简单易操作的图形化ubuntu系统。 镜像采用的是&#xff1a;ubuntu14.04.5-desktop-amd64.iso(官网下载的&#xff09; 配置环境的过程下载了众多依赖包&#xff0c;总之就是缺啥下载啥…

Mac 安装 jdk 8详细教程

Mac 电脑上安装Jdk 8 的步骤很简单&#xff0c;不用想Windows那样需要配置环境变量PATH、JAVA_HOME。 具体方法如下&#xff1a; 首先&#xff0c;去JDK官网下载对应版本的JDK 8。 这里需要注册一个账号&#xff0c;然后&#xff0c;账号下载。 下载完后&#xff0c;得到一个…

【IEEE独立出版 | 往届快至会后2个月检索】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024,9月27-29)

2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机学院、长春理工大学人工智能学院承办&#xff0c;多…

视频智能分析厨帽检测算法,厨帽检测算法全套源码、样本和模型展示

厨帽检测算法是一种基于人工智能和计算机视觉技术的系统&#xff0c;旨在自动检测厨师是否佩戴了符合规范的厨帽。该算法通过分析视频流或图像数据&#xff0c;实时识别厨帽的佩戴情况&#xff0c;从而帮助餐饮企业确保员工的着装符合卫生标准。这一技术广泛应用于餐馆、厨房、…

旋转排序:搜索算法

搜索旋转排序数组的算法设计 引言 在计算机科学的世界中&#xff0c;二分搜索算法被广泛认为是处理已排序数组查找任务的高效工具。 它通过不断将搜索范围缩小一半的方式&#xff0c;快速定位到所需元素的位置&#xff0c;这种方法的时间复杂度仅为O(log n)&#xff0c;使得…

开源轻量级进程监控工具monit的使用以及monit进程监控工具常用的监控配置案例示例大全

一、开源轻量级进程监控工具monit的应用 今天在服务器杀进程时&#xff0c;发现有一个进程一直在重启&#xff0c;寻找服务器各种定时任务未发现有定时程序&#xff0c;也没有发现supervisord的进程管理服务&#xff0c;后来才发现服务器上启用了monit这个工具&#xff0c;moni…