9月8号鹰角技术笔试AK代码

好不容易ak一次, 给自己攒点人品
1.第一题,因数分解, 有9都ok,有3只能找3和9,啥也没有只能找9.

#define ll long long
long long cnt(vector<int>& nums){
    int a[3] = {0};
    ll ans = 0;
    for(auto& num : nums){
        if(num % 9 == 0){
            ans += a[0] + ans[1] + ans[2];
            ++ans[2];
        }
        else if(num % 3 == 0){
            ans += a[1] + a[2];
            ++ans[1];
        }
        else{
            ans += a[2];
            ++a[0];
        }
    }
    return ans;
}

2.第二题,模拟,没啥好说的,注意越界和统计开始的数目(题目没有说开始都大于0)

int leftCnt(vector<vector<int>> &a, int k, vector<vector<int>>& attacks){
    int ans = 0, m = a.size(), n = a[0].size();
    for(auto& row : a){
        for(auto& num : row){
            if(num > 0)++ans;
        }
    }

    int range[8][2] = {
        {-1, -1}, {-1, 0}, {-1, 1}, 
        {0, -1}, {0, 1}, 
        {1, -1}, {1, 0}, {1, 1}, 
    };
    int aoe = (3 * k) / 2, cur = 0; // 有效攻击次数,注意不能像剑圣双刀被动那样,这里被动不会积攒次数
    for(auto& pos : attacks){
        int x = pos[0] - 1, y = pos[1] - 1;
        if(a[x][y] <= 0)continue;
        if(cur == 2){
            a[x][y] -= 3 * k;
            if(a[x][y] <= 0)--ans;
            for(auto& s : range){
                int nx = x + s[0], ny = y + s[1];
                if(nx < 0 || nx >= m || ny < 0 || ny >= n || a[nx][ny] <= 0)continue;
                a[nx][ny] -= aoe;
                if(a[nx][ny] <= 0)--ans;
            }
            cur = 0;
        }
        else{
            a[x][y] -= k;
            if(a[x][y] <= 0)--ans;
            ++cur;
        }
    }
    return ans;
}

3.bfs暴搜,9位26进制数记录状态

#define ll long long

void swap(int& a, int& b){
    a += b;
    b = a - b;
    a -= b;
}

ll calc(vector<string>& mat){
    ll ans = 0;
    for(int i = 0; i < 3; ++i){
        for(int j = 0; j < 3; ++j)
            ans = ans * 26 + mat[i][j] - 'a';
    }
    return ans;
}

bool isqualified(vector<string>& mat){
    for(int i = 0; i < 3; ++i){
        for(int j = 0; j < 3; ++j){
            if(i + 1 < 3 && mat[i][j] == mat[i + 1][j])return false;
            if(j + 1 < 3 && mat[i][j] == mat[i][j + 1])return false;
        }
    }
    return true;
}

vector<int> swapcnt(vector<vector<string>>& matrixs){
    vector<int> ans;
    for(auto& mat : matrixs){
        map<ll, int> mp;
        mp[calc(mat)] = 1;
        queue<vector<string>> q;
        q.push(temp);
        int op = 0;bool flag = false;
        while(!q.empty()){
            ll len = q.size();
            while(len--){
                auto temp = q.front();
                q.pop();
                if(isqualified(mat)){
                    flag = true;
                    break;
                }
                for(int i = 0; i < 3; ++i){
                    for(int j = 0; j < 3; ++j){
                        if(i + 1 < 3){
                            swap(temp[i][j], temp[i + 1][j]);
                            ll val = calc(temp);
                            if(mp.count(val) == false){
                                mp[val] = 1;
                                q.push(temp);
                            }
                            swap(temp[i][j], temp[i + 1][j]);
                        }
                        if(j + 1 < 3){
                            swap(temp[i][j], temp[i][j + 1]);
                            ll val = calc(temp);
                            if(mp.count(val) == false){
                                mp[val] = 1;
                                q.push(temp);
                            }
                            swap(temp[i][j], temp[i][j + 1]);
                        }
                    }
                }
            }
            if(flag)break;
            ++op;
        }
        if(flag)
            ans.push_back(op);
        else
            ans.push_back(-1);
    }
    return ans;
}
#鹰角网络笔试##题解#
全部评论
昨天还看了一下你这个贴,后悔没看解法,你这个第三题是我今天的第一题
点赞 回复 分享
发布于 2022-11-02 02:07 黑龙江
能冒昧地问下是什么岗的笔试吗?
点赞 回复 分享
发布于 2022-09-09 19:20 上海

相关推荐

08-14 21:54
已编辑
中国地质大学(武汉) Java
1.那现在从产品的视角来分析一下这个世界频道的功能应该是怎么定义的世界频道(王者荣耀这类游戏的世界频道)以及讨论一下它的技术实现有什么难点2.有没有了解过类似于QQ的群聊QQ的群聊是怎么实现的3.那假设让你实现一个群聊功能服务器的逻辑是怎么样子的(或者说可以描述一下整个链路,就是客户端一个用户发了一条消息开始,完整的数据传输流程,流转流程是什么样子)4.那在这个过程中服务器的作用就是将收到的消息转发给其他的用户对吧那你能详细说一下这方面的细节吗(是怎么转发的)5.那假如现在让你设计让你设计一个QQ,你会怎么设计这样的一个整个的系统流程来保证在线的用户可以实时收到一个消息然后不在线的用户也可以在下一次上线的时候看到历史的群聊消息6.&nbsp;OK那刚才你提到了一个客户端接收消息的机制那这个应该是一个什么样的呢?(这个群聊里有ABC三个人,A发了一条消息然后服务器把这个消息推送给谁,那这个推送一般是用什么技术或者什么协议实现)[可以使用websocket或者简单一点的话也可以直接使用TCP]7.刚才我们有提到就是在线的任务和离线的那怎么区分在线还是离线呢?(它其实就是可以通过TCP的饭店接吗他只要一直连着我的服务器那他就是在线)(面试官告诉我的一个过程:在线的用户要能实时收到消息,然后不在线的用户在上面之后也要看到这个历史消息,所以简单的完整的时间流程就是当a发了消息之后,就把这个消息存到这个群所对应的数据表里,然后再对每个人维护一个已读状态,然后如果这些人在线的话就单独更新一下,比如状态为一组就可以同时通过在线的这个TCP长连接把消息给它推出去,然后那些不在线的人在上线的那一刻就可以根据他的这个所有未读的消息整体做一个拉取然后已读之后再给它标记为已读就可以)8.那从这种情况回到刚才所聊的世界频道那世界频道和群聊在功能和实现上会有什么不同的地方(我回答了规模,历史信息是否保留)9.客户端什么时候知道能够去拉取这条消息10.有点像是刷帖子的意思就是我打开刷新,然后就主动拉取一次最新的消息,那假如我现在就一直打开了这个页面了那最新的消息应该怎么去获得(这里我回答的一个机制类似于刷帖子一样,然后面试官问我如果我一直打开这个页面保留在那里,我该怎么获取最新消息)11.或者我们反问一下就是从最开始出发他到底是真的是世界频道吗?(我这里回答可能是频道是划分了多个小频道然后的话可以根据地区可以根据时间戳来去划分)12.Java的JIT是什么13.&nbsp;Java的一段源代码从你写出来到最终执行这段过程发生了什么(可以回答牛客的那个面试专题部分的内容)14.&nbsp;Java将源代码编译成字节码之后交给JVM,那么我们C++中会编译成可执行文件交给机器执行这两个流程之间有什么不同15.现在具体到一条赋值语句int&nbsp;a&nbsp;=&nbsp;1+3;这条语句在C语言中编译成了二进制的机器码,然后直接运行这个程序然后在Java中编译成了字节码交给jvm,这两段运行的过程有什么区别16.Java的int和Integer有什么区别17.在这个转换的过程中有没有踩过什么坑(我回答了基本数据类型和包装类然后说了一下自动拆箱和装箱他就问在这个转换过程中有没有坑,我回答了如果自动装箱或拆箱的次数过多会导致性能不好)18.假如现在我们都使用integer那么两个之间的比较是使用==号吗?(围绕了equals()和==讲了一下)19.使用==比较integer的时候,明明两个内存地址是不一样的但是最终比较的时候是相等的(我回答了常量池这部分的知识)20.常量池是在哪里维护的(我回答了元空间(也就是堆))21.常量池我是怎么了解到的(我就回答之前遇到过相似的题目我就好奇为什么会这样子明明两个数相等但是比较出来的结果却是false进而去了解了常量池,还回答了常量池的作用)22.有没有看过关于Java的源代码比如说常量池部分的实现(我说我看过关于Redis部分的,就是使用Lua脚本部分,还回答了AQS部分,但是这个我是一带而过了)23.讲一下你看过的Redis的源代码以及收获(我这里就回答了我看过他底层的LUA脚本,Redis怎么去使用这个脚本来实现单线程以及其他的一些原理,锁的部分也提到了一点点(不过我确实有点忘记了))24.手撕题leetcode&nbsp;523连续子数组和:给你一个整数数组&nbsp;nums&nbsp;和一个整数&nbsp;k&nbsp;,如果&nbsp;nums&nbsp;有一个&nbsp;好的子数组&nbsp;返回&nbsp;true&nbsp;,否则返回&nbsp;false:一个&nbsp;好的子数组&nbsp;是:长度&nbsp;至少为&nbsp;2&nbsp;,且子数组元素总和为&nbsp;k&nbsp;的倍数。(我讲了一个思路,而且刚刚开始还理解错了)25.反问,没什么好说的,因为觉得自己肯定没了,也没多问
查看24道真题和解析
点赞 评论 收藏
分享
评论
7
30
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务