蚂蚁4.11笔试

news2024/11/15 19:44:55

文章目录

  • 前言
  • 一、红蓝格子填字母【蚂蚁4.11笔试第三题】
    • 解法一:二分解法
    • 解法二:模拟
  • 二、桌上弹球游戏【蚂蚁4.11笔试第二题】
  • 每日一题day82:困于环中的机器人(力扣1041)


前言

1、红蓝格子填字母
2、桌上弹球游戏
3、困于环中的机器人


一、红蓝格子填字母【蚂蚁4.11笔试第三题】

小红拿到了一排格子,每个格子的背景是红色或者蓝色。小红希望你将每个格子上填写一个小写字母,需要满足相同的字母背景颜色是相同的。
小红希望最终出现次数最多的字母的出现次数尽可能小。你能帮帮她嘛?

输入描述:
一个仅由字符’0’和’1’组成的字符串,长度不超过200000.
字符串用于表示小红拿到的格子的颜色。第 i 个字符为’0’代表第 i 个格子为蓝色背景,字符’1’ 代表第 i 个格子为红色背景。

输出描述:
一个仅由小写字母构成的字符串,第 i 个字符为第 i 个格子上填写的字母,请务必保证字符串是合法的。如果有多解,输出任意即可。

示例一:
输入 : 010
输出 : abc

示例二:
输入 : 0000000000000000000000000001
输出 : bbcdefghijklmnopqrstuvwxyza

解法一:二分解法

分析:
在这里插入图片描述
枚举了出现次数最大的字母,对于其他字母的话,最多也是这么多

public class heihei {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int num0 = 0, num1 = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '0')
                num0++;
            else
                num1++;
        }
        //二分次数
        int right = Math.max(num0, num1);
        int left = 1;
        int ans = 0;
        while(left <= right){
            int mid = (left + right) / 2;
            if(judge(num0, num1, mid)){
                ans = mid;
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        char c0 = 'a';
        char c1 = 'z';
        num0 = 0;
        num1 = 0;
        char[] res = new char[s.length()];
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '0'){
                num0++;
                res[i] = c0;
                if(num0 == ans){
                    c0++;
                    num0 = 0;
                }
            }else{
                num1++;
                res[i] = c1;
                if(num1 == ans){
                    c1--;
                    num1 = 0;
                }
            }
        }
        for(char c : res){
            System.out.print(c);
        }
    }
    public static boolean judge(int num0, int num1, int mid){
        int sum = 0;
        if(num0 % mid != 0){
            sum = sum + num0 / mid + 1;
        }else{
            sum = sum + num0 / mid;
        }
        if(num1 % mid != 0){
            sum = sum + num1 / mid + 1;
        }else{
            sum = sum + num1 / mid;
        }
        if(sum <= 26){
            return true;
        }
        return false;
    }
}

解法二:模拟

分析:
根据0/1的数量分配应该给他们的字母的个数,然后从a-z 26个字母里面给他们分配,然后用两个指针赋值。

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        int n = input.length();
        char[] array = input.toCharArray();
        double[] res1 = new double[]{0,0};
        char[] res3 = new char[n];
        //便利输入字符串,统计0/1出现的次数
        for (char c : array) {
            if(c == '0')
                res1[0]++;
            else
                res1[1]++;
        }
        double[] res2 = new double[2];

        //计算0和1的比例,并算出应该在26个字母中分配的个数,存储在res2中
        if(res1[0]<res1[1])
        {
            res2[0] = Math.ceil(26*(res1[0]/(res1[0]+res1[1])));
            res2[1] = 26 - res2[0];
        }
        else
        {
            res2[1] = Math.ceil(26*(res1[1]/(res1[0]+res1[1])));
            res2[0] = 26 - res2[1];
        }
//000000000000000000000000001
        String a2z = "abcdefghijklmnopqrstuvwxyz";
        //s0是给0分配的字母
        String s0 = a2z.substring(0,(int)res2[0]);
        //s1是给1分配的字母
        String s1 = a2z.substring((int)res2[0],a2z.length());

        //双指针
        int zeroIndex = 0;
        int oneIndex = 0;

        //输入少于等于26时直接输出
        if(input.length()<=26)
        {
            System.out.println(a2z.substring(0,input.length()));
        }
        else
        {
            for (int i = 0; i < n; i++) {
                if(array[i] == '0')
                {
                    res3[i] = s0.charAt(zeroIndex);
                    zeroIndex++;
                    if(zeroIndex >= s0.length())
                    {
                        zeroIndex = 0;
                    }
                }
                else
                {
                    res3[i] = s1.charAt(oneIndex);
                    oneIndex++;
                    if(oneIndex >= s1.length())
                    {
                        oneIndex = 0;
                    }
                }
            }
            String result = new String(res3);
            System.out.println(result);
        }
        HashMap<Character,Integer> map = new HashMap<>();
        for (char c : res3) {
            map.put(c,map.getOrDefault(c,0)+1);
        }
        for (Map.Entry<Character, Integer> characterIntegerEntry : map.entrySet()) {
            System.out.println(characterIntegerEntry.getKey()+"->"+characterIntegerEntry.getValue());
        }
    }

二、桌上弹球游戏【蚂蚁4.11笔试第二题】

小红在玩一个桌上弹球游戏。已知桌子可以视为一个n*m的矩阵,初始有一个小球的坐标为(i,j)(可以视为第i行第j列)。小球会以以下四个方向之一开始运动:

  • 小球向右下运动,记为“DR”。每过一秒小球会从(i,j)坐标移动到(i+1,j+1)坐标。
  • 小球向左下运动,记为“DL”。每过一秒小球会从(i,j)坐标移动到(i+1,j-1)坐标。
  • 小球向右上运动,记为“UR”。每过一秒小球会从(i,j)坐标移动到(i-1,j+1)坐标。
  • 小球向左上运动,记为“UL”。每过一秒小球会从(i,j)坐标移动到(i-1,j-1)坐标。

当小球撞到墙的时候会反弹,反向发生改变。
小球将不断行进,永不停止。现在给定了桌面大小。以及小球的初始坐标和初始方向。请问小球多少秒后将回到初始点?
输入描述:
第一行输入两个正整数n和m,代表桌面矩阵的行数和列数。
第二行输入两个正整数i和j以及一个长度为2的字符串d,代表小球的初始坐标和方向。
d∈{DR,DL,UR,UL}

输出描述:
一个整数,代表小球回到初始点需要经过的秒数

示例一:
输入 :
5 7
1 7 DL

输出 :
24

模拟:
需要考虑一些边界问题

    public static void main(String[] args) {
        //输入
        Scanner input = new Scanner(System.in);
        //n行m列
        int n = input.nextInt();
        int m = input.nextInt();
        //初始位置(x,y)
        int x = input.nextInt();
        int y = input.nextInt();
        //初始方向
        String d = input.next();
        int count = 0;
        //修正存储和输入的起点索引不一致
        x = x - 1;
        y = y - 1;
        int tx = x, ty = y;  //当前坐标
        String dir = d;  //当前方向
        while(true){     //一定要考虑全面边界条件,以及典型样例包括网格为1*1的
            //不同方向的走法
            if(dir.equals("DL")){
                tx = tx + 1;
                ty = ty - 1;
            }else if(dir.equals("DR")){
                tx = tx + 1;
                ty = ty + 1;
            }else if(dir.equals("UL")){
                tx = tx - 1;
                ty = ty - 1;
            }else if(dir.equals("UR")){
                tx = tx - 1;
                ty = ty + 1;
            }
            //判断所处当前坐标的方向是否需要改变改变
            String t = modifyDir(tx, ty, n, m, dir);
            if(!dir.equals(t)){
                //相当于已经走出边界了,需要返回到网格中来
                if(dir.equals("DL")){
                    tx = tx - 1;
                    ty = ty + 1;
                }else if(dir.equals("DR")){
                    tx = tx - 1;
                    ty = ty - 1;
                }else if(dir.equals("UL")){
                    tx = tx + 1;
                    ty = ty + 1;
                }else if(dir.equals("UR")){
                    tx = tx + 1;
                    ty = ty - 1;
                }
                count--; //走出网格这一步多走了,返回去减1
            }
            dir = t;
            count++;//计时
            if(tx == x && ty == y){
                System.out.println(count);
                break;
            }
        }
    }

    public static String modifyDir(int tx, int ty, int n, int m, String dir){
        //
        if((tx < 0 && dir.charAt(0) == 'U') || (tx == n && dir.charAt(0) == 'D')){
            //撞上下边,只改变上下方向,左右方向不变
            if(dir.charAt(0) == 'U'){
                dir = dir.replace('U', 'D');
            }else{
                dir = dir.replace('D', 'U');
            }
        }
        //这两个if之间不能加else,因为可能存在对角线反弹
        if((ty < 0 && dir.charAt(1) == 'L') || (ty == m && dir.charAt(1) == 'R')){
            //撞左右边,只改变左右方向,上下方向不变
            if(dir.charAt(1) == 'L'){
                dir = dir.replace('L', 'R');
            }else{
                dir = dir.replace('R', 'L');
            }
        }
        return dir;
    }

每日一题day82:困于环中的机器人(力扣1041)

在这里插入图片描述
在这里插入图片描述

大佬题解

class Solution {
 public boolean isRobotBounded(String instructions) {
        int k = 0;//表示位移
        int[] dist = new int[4];
        for(int i=0;i<instructions.length();i++){
            char c = instructions.charAt(i);
            if(c=='L'){
                k=(k+1)%4;
            }else if(c=='R'){
                k=(k+3)%4;
            }else{
                dist[k]++;
            }
        }
        return (dist[0] == dist[2] && dist[1] == dist[3]) || (k != 0);
    }
}

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

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

相关文章

12 个好用且不花钱的网络监控工具

导读要让一个多级机构运行良好而且平稳的话&#xff0c;一个非常艰巨重大的任务就是做好网络管理。每个机构都配备专门的人员&#xff0c;即网络分析师&#xff0c;来进行网络管理。他们 使用了 许多工具来监视网络的运行状况&#xff0c;并查看网络流量的上升和下降状况。他们…

机器学习 03 K-近邻算法

目录 一、K-近邻算法 1.1 K-近邻算法(KNN)概念 1.1.1 概念理解举例 1.2 KNN算法流程总结 1.3 K值的选择 1.3.1 举例说明 1.4 kd树 1.4.1 KD树原理 1.4.2 树的建立 1.5 最近领域的搜索 k近邻算法优缺点 二、距离度量 2.1 距离公式的基本性质 2.2 常见的距离 2.2.…

进程间通信之消息队列

消息队列一. 什么是消息队列二. 消息队列有关函数1.获取key - ftok2.创建消息队列 - msgget3.发送消息 - msgsnd4.接收消息 - msgrcv5.删除消息队列 - msgctl三. 实例注意:一. 什么是消息队列 消息队列独立于发送消息的进程和接收消息的进程&#xff0c;消息队列是消息的链表&…

【牛客刷题专栏】0x19:JZ18 删除链表的节点(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…

GPT-5年底上线?初创公司Runway CEO再爆料:OpenAI员工相信GPT-5有望成AGI

来源: 新智源 微信号&#xff1a;AI-era 最近&#xff0c;Runway CEO关于GPT-5的爆料&#xff0c;又被网友们翻了出来&#xff0c;讨论得热火朝天。不论AGI会在哪一年出现&#xff0c;显然&#xff0c;能见证这一天的人都是幸运的。 最近&#xff0c;又有网友翻出了关于GPT-5的…

初识Linux+Linux基本指令(一)

目录 一.&#x1f606;计算机与操作系统&#x1f606; 计算机与操作系统发展史简介: 计算机与操作系统的关系: 二.&#x1f604;Linux操作系统&#x1f604; 开源软件的代名词:Linux 非图形化界面的Liunx 三.&#x1f606;Linux基本指令之文件管理篇&#x1f606; 1.操…

Spring配置数据源

Spring配置数据源数据源的作用环境准备手动创建c3p0数据源封装抽取关键信息&#xff0c;手动创建c3p0数据源使用Spring容器配置数据源数据源的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源&#xff0c;初始化部分连接资源 使用连接资源时从数据源中获取 使用完…

网络安全行业现在好混吗,工资水平怎么样?

前段时间看到有人私信&#xff1a;网络安全行业现在好混吗&#xff0c;工资水平怎么样&#xff1f;今天在这里做个回答&#xff0c;不知你所说的“好混吗”指的是什么&#xff1f; 薪资高&#xff0c;待遇好&#xff1f;不加班&#xff0c;活儿少&#xff1f;不受气&#xff0…

我的创作纪念日 - 2048

2048 ✌️ 今天是 2023 年 4 月 10 日&#xff0c;系统说我在 2017 年 08 月 31 日那天发布了第一篇博客&#xff08;【算法】编写一个能将给定非负整数列表中的数字排列成最大数字的程序&#xff09;&#xff0c;距离当时已经有 2048 天了&#xff0c;2048 这个数字真的很能挑…

短期突击面试攻略,收offer如砍瓜切菜!!!

​​​​​现在的面试是什么样的&#xff1f; 面试官拿到简历后会先看下你的技术栈&#xff0c;他面试你的问题就来自这些技术栈 面试官都是看人下菜碟&#xff0c;每次面试问的问题都不一样&#xff0c;会根据你回答问题的情况来决定深入的程度&#xff0c;直到了解清楚你的…

△形网络和Y型网络的变换

△形网络和Y型网络的变换 △形网络也称三角形网络&#xff0c;Y也称星形网络 我们今天就来看下这两种网络是如何变换的。 看下面的电路 如何通过计算得出电流表的读数&#xff1f; 显然电路的串并联结构并不是那么纯粹&#xff0c;Ra Rb Rc构成了一个 △形网络,如下图所示。…

小学数学题升维思考,降维打击

目录一、背景二、题目三、过程1.形式转换2.个位数相加只能向前进一位嘛&#xff1f;3.十位数上要填写的内容?4.如何下意识的去做结构化&#xff1f;四、总结五、升华一、背景 公司的产品是做K12的教育平台&#xff0c;马老板也受感染研究起了小学数学题。一道二年级的题让我窥…

Java阶段一Day19

Java阶段一Day19 文章目录Java阶段一Day19对象流字符流WriterReader转换流缓冲字符流BufferedWriter与PrintWriterBufferedReader异常Throwable、Error、Exception异常处理机制throwthrowstry-catchfinally面试题教师总结新单词JAVA IO对象流对象输入流构造器方法例transient关…

求根号n下界

目录 求根号n 程序设计 程序分析 求根号n 【问题描述】设计一个计算的算法,n是任意正整数。 除了赋值和比较运算,该算法只能用到基本的四则运算操作。 【输入形式】输入一个正整数 【输出形式】输出答案 【样例输入】10 【样例输出】3 【样例说明】表示对n开平方后向…

Linux线程基础:控制和封装

本节重点&#xff1a; 1. 了解线程概念&#xff0c;理解线程与进程区别与联系。 2. 学会线程控制&#xff0c;线程创建&#xff0c;线程终止&#xff0c;线程等待。 3. 了解线程分离与线程安全概念。 Linux线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;threa…

机器学习 00 归一化/标准化

目录 一、归一化/标准化 1.1 为什么我们要进行归一化/标准化? 二、归一化 2.1 定义 2.2 公式 2.3 归一化总结 三、标准化 3.1 定义 3.2 公式 3.3 标准化总结 一、归一化/标准化 1.1 为什么我们要进行归一化/标准化? 特征的单位或者大小相差较大&#xff0c;或者某…

我的软件研发套路

春节回来之后&#xff0c;调整到一个新的团队工作。 团队&#xff0c;是已有的&#xff1b;所用的技术栈&#xff0c;不熟悉&#xff1b;所做的业务领域&#xff0c;也涉猎甚少。挑战比较大。 管理层对团队的产出不满。我的首要任务&#xff0c;是提升团队的效能。 目前团队…

左中右 三栏式 布局

一、中间 自适应&#xff0c;左右两边 宽度固定 方法1&#xff1a;box容器 Flex布局&#xff0c;center设置为 flex:1 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

神经网络/深度学习(一)

感知机 多层感知机&#xff08;神经网络&#xff09; 误差逆传播&#xff08;error BackPropagation&#xff0c;简称BP&#xff09;算法 深度学习 卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09; 递归&#xff08;循环&#xff09;神经网络&#xf…

sonar覆盖率、代码覆盖率、分支覆盖率的计算方式

代码质量的覆盖率分为三种&#xff0c;覆盖率、代码覆盖率、分支覆盖率&#xff0c;那每一种的计算方式是怎么样的呢&#xff1f; 举例&#xff1a; 上面最有疑惑的是覆盖率&#xff0c;不知道怎么算出了来的&#xff0c;后面再说。 通过sonarqube可以分析出&#xff1a; 指标…