程序员面试金典16.*

news2024/12/21 18:55:29

文章目录

  • 16.01 交换数字
  • 16.02单词频率
  • 16.03交点
  • 16.04 井字游戏
  • 16.05 阶乘尾数
  • 16.06 最小差
  • 16.07 最大数值
  • 16.08 整数的英文表示
  • 16.09 运算
  • 16.10 生存人数
  • 16.11 跳水板
  • 16.13 平分正方形
  • 16.14 最佳直线(待定)
  • 16.15珠玑妙算
  • 16.16部分排序
  • 16.17连续数列
  • 16.18 模式匹配
  • 16.19水域大小
  • 16.20 T9键盘
  • 16.21 交换和
  • 16.22 兰顿蚂蚁(未做)
  • 16.24 数对和
  • 16.25 LRU缓存
  • 16.26 计算器

16.01 交换数字

在这里插入图片描述
方式一: 在原有的基础修改 a = a + b; b = a - b; a = a - b;

方式二: 异或 a = a ^ b; b = a ^ b; a = a ^ b;

16.02单词频率

一个HashMap就行

16.03交点

数学题,太恶心了,算了。

16.04 井字游戏

在这里插入图片描述
这个题就直接模拟就好。
这个题判断赢用的是(int)‘X’ * length,不过可能会出小问题,用0和1应该会好一点,不过此时还要考虑当遇到" " 的时候返回什么。

class Solution {
    public String tictactoe(String[] board) {

        int length = board.length;
        int heng = 0; //横的和
        int zong = 0; //纵的和
        int left = 0; //左斜线
        int right = 0; //右斜线
        boolean flag = false; //记录有没有空格

        for (int i = 0; i < length; i++) {

            heng = 0; zong = 0;

            for (int j = 0; j < length; j++) {

                heng = heng +  (int) board[i].charAt(j);
                
                zong = zong + (int) board[j].charAt(i);

                if(board[i].charAt(j) == ' ') flag = true;

            }

            //横纵检查
            if (heng == (int)'X' * length || zong == (int)'X' * length) return "X";
            
            if (heng == (int)'O' * length || zong == (int)'O' * length) return "O";

            //两条斜线上的相加
            left = left + (int)board[i].charAt(i);
            right = right + (int)board[i].charAt(length - i - 1);

        }

        //两条斜线检查
        if (left == (int)'X' * length || right == (int)'X' * length) return "X";
        if (left == (int)'O' * length || right == (int)'O' * length) return "O";

        if (flag) return "Pending";
        return "Draw";

    }
}

16.05 阶乘尾数

在这里插入图片描述
0 是由 *10 得到的,而 10 是由 2 * 5 得到的
因此我们求 n! 过程中存在多少个 2 * 5
因为 2 的个数必定比 5 的个数多,因此我们只求 5 的个数
n! = 1 * 2 * 3 * 4 * (1 * 5) * … * (2 * 5) * … * (3 * 5) …
当然因为存在25和125这类数,所以
count = n / 5 + n / 25 + n / 125 + …
因此可以转换为一个循环 n=n/5; count+=n;

16.06 最小差

排序,然后双指针。

16.07 最大数值

了解一下位运算, 移位操作。比较一下符号位即可

16.08 整数的英文表示

没啥意思

16.09 运算

挺无语的,不用做。

16.10 生存人数

在这里插入图片描述
差分数组的思想
birth那里+1, death的下一位 -1
再对差分数组求和,求最大值即可

16.11 跳水板

太简单了,pass

16.13 平分正方形

在这里插入图片描述
求过两个正方形中心的直线即可,如果两者中心重合,取垂直于x轴的直线。再根据斜率判断与正方形哪条边相交。题目简化了很多,模拟就好。

16.14 最佳直线(待定)

对于特定的一组直线AX+BY+C=0,去求最大

16.15珠玑妙算

用一个哈希表就行

16.16部分排序

在这里插入图片描述

你可以直接排序,然后原数组与排序数组比较。也可以用下面的思路遍历一遍。

首先虽然题目没说,但是实际运行下来数列是单调递增的,所以我们下面默认数列是递增的。

那么对于元素 a[i] 来说,如果它左边存在大于 a[i] 的元素,那么 a[i] 是一定要参与到排序里去的。或者说如果它右边存在小于 a[i] 的元素,那么 a[i] 也是要参与到排序里去的。

所以我们只需要寻找最靠右的那个数(满足左边存在大于它的数),和最靠左的那个数(满足右边存在小于它的数),那么这两个数之间就是要排序的区间了。

为什么最靠右的那个(满足左边存在大于它的数)数一定能保证右边没有更小的数了呢?因为如果右边还有更小的数,那么那个更小的数才是更靠右的啊,这就矛盾了。

所以我们只需要从左到右扫描一遍,用一个变量维护一下最大值就行了,然后反向再遍历一遍,维护一个最小值。

class Solution {
    public int[] subSort(int[] array) {
        int size1=array.length;
        int minValue=Integer.MAX_VALUE;
        int maxValue=Integer.MIN_VALUE;
        int left=-1,right=-1;
        for(int i=0;i<size1;i++){
            if(maxValue<=array[i]) maxValue=array[i];
            else right=i;
        }
        if(right==-1) return new int[]{-1,-1};
        for(int i=size1-1;i>-1;i--){
            if(minValue>=array[i]) minValue=array[i];
            else left=i;
        }
        return new int[]{left,right};

    }
}

16.17连续数列

在这里插入图片描述

注意是先赋值给maxValue,再ans=0;主打一个贪心。

class Solution {
    public int maxSubArray(int[] nums) {
        int size1=nums.length;
        int ans=0;
        int maxValue=Integer.MIN_VALUE;
        for(int i=0;i<size1;i++){
            ans+=nums[i];
            if(ans>maxValue) maxValue=ans;
            if(ans<0) ans=0;    
        }
        return maxValue;

    }
}

16.18 模式匹配

这种题用python写好一点,别的语言好麻烦。

16.19水域大小

经典DFS
在这里插入图片描述

class Solution {
    public int[] pondSizes(int[][] land) {
        int aLength=land.length;
        int bLength=land[0].length;
        int count=0;
        ArrayList<Integer> array=new ArrayList<>();

        for(int i=0;i<aLength;i++){
            for(int j=0;j<bLength;j++){
                count=dfs(land,i,j);
                if(count!=0) array.add(count);
            }
        }

        int[] ans=new int[array.size()];
        for(int i=0;i<array.size();i++) ans[i]=array.get(i);
        Arrays.sort(ans);
        return ans;

    }

    public int dfs(int[][]land, int i, int j){
        if(i<0 || i>=land.length || j<0 || j>=land[0].length || land[i][j]!=0) return 0;
        land[i][j]=-1;
        int count=1;
        count+=dfs(land,i-1,j);
        count+=dfs(land,i-1,j-1);
        count+=dfs(land,i-1,j+1);
        count+=dfs(land,i,j-1);
        count+=dfs(land,i,j+1);
        count+=dfs(land,i+1,j-1);
        count+=dfs(land,i+1,j);
        count+=dfs(land,i+1,j+1);
        return count;

    }
}

16.20 T9键盘

用一个大数组先记录一下就行

16.21 交换和

排序后双指针就行

16.22 兰顿蚂蚁(未做)

题目读起来好费劲,不过应该就是一个模拟题

16.24 数对和

排序后双指针,或者用哈希表也行

16.25 LRU缓存

解决方案:链表(处理新老关系),哈希表(查询元素有没有)
用LinkedHashMap或者 双向链表+哈希表
别人的博客
主要是实现一 和 实现三

16.26 计算器

在这里插入图片描述
用栈来模拟

class Solution {
    public int calculate(String s) {
        Deque<Integer> stack=new ArrayDeque<Integer>();
        char preSign = '+';
        int num = 0;
        int n = s.length();
        for(int i=0;i<n;i++){
            if(Character.isDigit(s.charAt(i))){
                num=num*10+s.charAt(i)-'0';
            }
            if((!Character.isDigit(s.charAt(i)) && s.charAt(i)!=' ')  || i==n-1){
                switch(preSign){
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        preSign = '*';
                        stack.push(num*stack.pop());
                        break;
                    case '/':
                        preSign = '/';
                        stack.push(stack.pop()/num);
                }
                num=0;
                preSign=s.charAt(i);

            }
        }
        int ans=0;
        while(!stack.isEmpty()){
            ans+=stack.pop();
        }
        return ans;

    }
}

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

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

相关文章

Hadoop HDFS的API操作

客户端环境准备 hadoop的 Windows依赖文件夹&#xff0c;拷贝hadoop-3.1.0到非中文路径&#xff08;比如d:\&#xff09;。 配置HADOOP_HOME环境变量 配置Path环境变量。 不能放在包含有空格的目录下&#xff0c;cmd 输入hadoop显示此时不应有 \hadoop-3.0.0\bin\。我放在…

关于linux中防火墙的命令

文章目录 一、linux 6.5 下二、linux 7.0 下 (CentOs7.3)常用命令 三、关于端口的一些命令四、一些状况 linux不同版本防火墙是不同的&#xff0c;命令如下 一、linux 6.5 下 service iptables status ## 查看防火墙状态 service iptables start ## 开启防火墙 service iptab…

谁还在AI焦虑?

时至今日&#xff0c;人们对GPT 为首的诸多AI&#xff0c; 大有热情消退的迹象。 与2个月前相比&#xff0c;简直恍如隔世。 这也进步一部印证了“山洞隐喻” 人类始终对未知充满恐惧和焦虑。 曾经人们忧心忡忡&#xff0c;整天讨论AI&#xff0c; 取代人类工作之后&…

如何用ChatGPT做新品上市推广方案策划?

该场景对应的关键词库(28个&#xff09;&#xff1a; 品牌、产品信息、新品、成分、属性、功效、人群特征、客户分析、产品定位、核心卖点、推广策略、广告、公关、线上推广、线下活动、合作伙伴、资源整合、预算、执行计划、监测、评估、微调方案、价值主张、营销策略、热点话…

第四十七章 Unity 布局(中)

在上一章节中我给父元素Panel添加了Horizontal Layout Group组件&#xff0c;并且添加了两个Text元素。 我们发现两个Text UI 元素在水平方向上面依次放置在Panel的最上面。由于Panel的宽度为300&#xff0c;而两个Text的总宽度为 160 160 320&#xff0c;因此两个Text 超出了…

C++入门知识(下)

目录 一、内联函数 1.1内联函数的概念 1.2内联函数的使用 1.3内联函数的特性 1.4宏的优缺点 1.5C中可替代宏的技术 二、auto关键字 2.1什么是auto关键字 2.2auto简介 2.3auto的使用细则 2.4auto不能推导的场景 三、基于范围的for循环&#xff08;C11&#xff09; 3.…

大屏只用来做汇报?知道这6个应用场景,直接升职加薪!

五一假几个朋友小聚了一下&#xff0c;好久没联系了&#xff0c;现在才知道大家从事行业五花八门的。知道我从事IT行业好几年&#xff0c;他们非要让我讲讲现在异常火爆的大屏&#xff0c;说是所在企业单位都在研究这玩意儿&#xff0c;有的业务人员焦虑不已不知道如何下手&…

Lenovo m93 mini 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo m93 mini 处理器Intel i5-4590T 2.20GHz (35w) 4-core/4-thread已驱动 内存8GB (2x4) DDR3 1600MHz已驱动 硬盘2.5" SSD Samsung 8…

《Linux 内核设计与实现》11. 定时器和时间管理

文章目录 内核中时间的概念节拍率&#xff1a;HZ理想的 HZ 值高 HZ 的优势高 HZ 的劣势 jiffiesjiffies 的内部表示jiffies 的回绕用户空间和 HZ 硬时钟和定时器实时时钟系统定时器 时钟中断处理程序实际时间定时器使用定时器定时器竞争条件实现定时器 延迟执行忙等待短延迟sch…

跨境商城APP开发需要注意的问题

随着全球化的趋势&#xff0c;跨境电商发展迅猛&#xff0c;越来越多的企业开始进军跨境市场。而跨境商城APP已经成为跨境电商非常重要的一部分。在开发跨境商城APP时&#xff0c;需要注意以下问题&#xff1a; 1.多语言支持 跨境商城APP需要支持不同国家和地区的语言&#x…

在基于Android以及Jetson TK平台上如何写32位的Thumb-2指令

由于Android以及Jetson TK的编译工具链中的汇编器仍然不支持大部分的32位Thumb-2指令&#xff0c;比如 add.w&#xff0c;因此我们只能通过手工写机器指令码来实现想要的指令。下面我将简单地介绍如何在ARM GCC汇编器中手工去写机器指令码。 对于GCC或Clang的汇编器&#xff0…

es6 学习笔记-1

学习视频&#xff1a;尚硅谷Web前端ES6教程&#xff0c;涵盖ES6-ES11_哔哩哔哩_bilibili 一、介绍 ES&#xff1a;全称为EcmaScript,是脚本语言的规范 ECMAScript&#xff1a; 由Ecma国际通过ECMA-262标准化的脚本程序设计语言。 es6兼容性&#xff1a;ECMAScript 6 compa…

adb logcat 保存日志文件到本地

指令 adb logcat > logcat.log例如&#xff1a;例如&#xff1a;adb logcat > D:\logcat.log 注意window中直接输入可能会出现log文件打开显示乱码问题&#xff1b; 请打开cmd检查 输入 chcp 如图 查看结果 如果不是65001 则 执行 chcp 65001 之后执行 例如&#x…

antd 中日期组件添加左侧日期范围选择

一、产品需求 产品有这样一个需求&#xff0c; 在实时的日期组件左侧添加一个快捷时间范围选择&#xff0c;并且选择后&#xff0c;窗口不会自动关闭。 大致样式长这样&#xff1a; 二、需求拆解 拆解一下这个需求&#xff0c;需要满足三个要点&#xff1a; ① 快捷时间范围…

Linux学习之Shell(一)

Shell概述 1&#xff09;Linux提供的Shell解析器有 [xiaominghadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh2&#xff09;bash和sh的关系 [xiaominghadoop101 bin]$ ll | grep bash -rwxr…

LinkFlow CDP洞察能力升级,结合订单开启营销新趋势

4月26日&#xff0c;悠易科技LinkFlow在春季产品发布会上对其洞察产品能力进行了升级。 在技术赋能以人为本的营销5.0阶段&#xff0c;伴随技术的发展&#xff0c;消费者很容易接触到不同的产品和服务&#xff0c;也可以很方便的通过社交网络以及各种社群找到跟自己有相同兴趣…

第四十一章 Unity 输入框 (Input Field) UI

本章节我们学习输入框 (Input Field)&#xff0c;它可以帮助我们获取用户的输入。我们点击菜单栏“GameObject”->“UI”->“Input Field”&#xff0c;我们调整一下它的位置&#xff0c;效果如下 我们在层次面板中发现&#xff0c;这个InputField UI元素包含两个子元素&…

PMP项目管理-[第十章]沟通管理

沟通管理知识体系&#xff1a; 规划沟通管理&#xff1a; 10.1 沟通维度划分 10.2 核心概念 定义&#xff1a;通过沟通活动(如会议和演讲)&#xff0c;或以工件的方式(如电子邮件、社交媒体、项目报告或项目文档)等各种可能的方式来发送或接受消息 在项目沟通中&#xff0c;需要…

聊聊并发编程的12种业务场景

前言 并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。 并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f; 答&#xff1a;不一定&#xff0c;要看具体业务场景。 毕竟如果使用了多线程&…

用DevExpress WinForms富文本编辑器,集成高级文本编辑功能(一)

DevExpress WinForm富文本编辑器&#xff08;RTF编辑器&#xff09;控件允许用户将高级文本编辑功能集成到下一个WinForms项目中&#xff0c;它包括全面的文本格式选项、支持邮件合并&#xff0c;并附带了丰富的终端用户选项集&#xff0c;因此可以轻松交付受Microsoft word启发…