秋招突击——7/20——科大讯飞笔试相关——提前{图像叠加、世界杯积分问题、直角三角形个数}——正式{持续输出中位数,二次幂和三次幂的序列表示}

文章目录

    • 引言
    • 提前
      • 图像叠加
      • 世界杯积分问题
        • 个人实现
        • 参考实现
      • 直角三角形个数
        • 个人实现
    • 正式
      • 等待时间期望值
      • 中位数输出
        • 个人实现
      • 二次幂和三次幂序列
        • 个人实现
    • 总结

引言

  • 昨天用了牛客网做了一下作业帮的笔试,做的一塌糊涂,但是提醒我要练习使用牛客网的环境进行相关的开发,差不多练了三四个小时,做了两道题。
  • 今天晚上七点钟到九点钟是科大讯飞的笔试时间,今天准备上午总结一下以前做的题型,然后的做一套科大讯飞前年的试卷。
    • 试卷链接

提前

图像叠加

在这里插入图片描述

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// deinfe the data to store the imageint m = in.nextInt();int n = in.nextInt();int[][][] img = new int[2][m][n];for(int i = 0;i < 2;i ++){for(int r = 0;r < m;r ++){for(int c = 0;c < n;c ++){img[i][r][c] = in.nextInt();}}}// handle the imgint [][] res = new int[m][n];for(int i = 0;i < m;i ++){for(int j = 0;j < n;j ++){res[i][j] = img[0][i][j] + 2 * img[1][i][j] - 255;if(res[i][j] < 0) res[i][j] = 0;else if(res[i][j] > 255) res[i][j] = 255;  System.out.print(res[i][j] + " ");}System.out.println();}}
}

在这里插入图片描述

总的来说,这道题还是很简单的!

世界杯积分问题

在这里插入图片描述

个人实现
  • 这题感觉就是一个正确答案的话,就是能够模拟计算出所有的情况,然后形成一个hash,然后返回大小,并且判定结果是否存在即可!关键在于怎么模拟!
  • 不是很懂这个赛制,正常来说肯定是C(5,2),这个感觉得用递归去做,但是我觉得有点别扭,整起来怪怪的!

这里用回溯重实现了一下,是不是太过于繁琐了?

import java.util.Scanner;
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static Set<List<Integer>> set = new HashSet<>();static Pair[] vs = new Pair[10];static class Pair{public int x;public int y;public Pair(int a,int b){x = a;y = b;    }}static void dfs(int idx ,List<Integer> score){if(idx == 10)  { List<Integer> tempList = new ArrayList<>(score);Collections.sort(tempList);set.add(tempList);}else{// traverse 3 conditions// a win bscore.set(vs[idx].x,score.get(vs[idx].x) + 3);dfs(idx + 1,score);score.set(vs[idx].x,score.get(vs[idx].x) - 3);// a lose bscore.set(vs[idx].y,score.get(vs[idx].y) + 3);dfs(idx + 1,score);score.set(vs[idx].y,score.get(vs[idx].y) - 3);// a and bscore.set(vs[idx].x,score.get(vs[idx].x) + 1);score.set(vs[idx].y,score.get(vs[idx].y) + 1);dfs(idx + 1,score);score.set(vs[idx].x,score.get(vs[idx].x) - 1);score.set(vs[idx].y,score.get(vs[idx].y) - 1);}}public static void main(String[] args) {// define vs[] to store the copmetition seq, score to store the score of each teamList<Integer> score = new ArrayList<>(Arrays.asList(0,0,0,0,0));int idx = 0;for(int i = 0;i < 5;i ++){for(int j = i + 1;j < 5;j ++){vs[idx] = new Pair(i,j);idx ++;}}dfs(0,score);// handle the input Scanner in = new Scanner(System.in);int count = in.nextInt();if(set.size() == count )  System.out.print("yes ");else System.out.print("no ");List<Integer> temp = new ArrayList<>();for(int i = 0;i < 5;i ++){temp.add(in.nextInt());}Collections.sort(temp);if(set.contains(temp))  System.out.println("yes");else System.out.println("no");// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint a = in.nextInt();int b = in.nextInt();System.out.println(a + b);}}
}
参考实现
  • 同样的方法,但是他写的好像比我简洁!
import java.util.*;public class Main {static Set<List<Integer>> validScores = new HashSet<>();static final int TEAMS = 5;static final int GAMES = 10;public static void main(String[] args) {// 生成所有可能的得分组合generateAllPossibleScores(new int[TEAMS], 0, 0, 0);// 读取输入Scanner scanner = new Scanner(System.in);List<Integer> inputScores = new ArrayList<>();for (int i = 0; i < TEAMS; i++) {inputScores.add(scanner.nextInt());}Collections.sort(inputScores, Collections.reverseOrder());// 判断输入的得分组合是否在所有可能的得分组合中if (validScores.contains(inputScores)) {System.out.println("yes");} else {System.out.println("no");}scanner.close();}// 递归生成所有可能的得分组合static void generateAllPossibleScores(int[] scores, int gameIndex, int teamA, int teamB) {if (gameIndex == GAMES) {List<Integer> sortedScores = new ArrayList<>();for (int score : scores) {sortedScores.add(score);}Collections.sort(sortedScores, Collections.reverseOrder());validScores.add(sortedScores);return;}// 获取当前的比赛队伍组合teamA = gameIndex / (TEAMS - 1);teamB = gameIndex % (TEAMS - 1);if (teamB >= teamA) {teamB++;}// A winsscores[teamA] += 3;generateAllPossibleScores(scores, gameIndex + 1, teamA, teamB);scores[teamA] -= 3;// B winsscores[teamB] += 3;generateAllPossibleScores(scores, gameIndex + 1, teamA, teamB);scores[teamB] -= 3;// Drawscores[teamA] += 1;scores[teamB] += 1;generateAllPossibleScores(scores, gameIndex + 1, teamA, teamB);scores[teamA] -= 1;scores[teamB] -= 1;}
}

但是不是很好读,不是很好理解!

直角三角形个数

在这里插入图片描述

个人实现
  • 这道题会相对好做一点,准备采用暴力搜索的方式解决,现在是怎么提前计算,才能减少计算量。使用一个二维数组提前保存下来,应该是可以的!
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// get the dataint count = in.nextInt();int[][] point = new int[count][2];int[][] dist2 = new int[count][count];for(int i = 0;i < count;i ++){point[i][0] = in.nextInt();point[i][1] = in.nextInt();// cal the distance square of the pointsfor(int j = 0;j < i;j ++){dist2[i][j] = (int)Math.pow((point[i][0] - point[j][0]),2) +  (int)Math.pow((point[i][1] - point[j][1]),2) ;dist2[j][i] = dist2[i][j];}}// define the set to filter the resultSet<List<Integer>> set = new HashSet<>();for(int a = 0;a < count ;a ++){for(int b = a + 1;b < count ;b ++){for(int c = b + 1;c < count ;c ++){int maxLen = Math.max(Math.max(dist2[a][b],dist2[a][c]),dist2[b][c]);if(2 * maxLen == dist2[a][b] + dist2[a][c] + dist2[b][c]){set.add(Arrays.asList(a,b,c));}}}}System.out.println(set.size());}
}

在这里插入图片描述
这里直接暴力通过了,还是比较意外的,感觉应该有什么特殊的数学关系可以调用的!

正式

等待时间期望值

  • 这个太简单了,就不写了!

中位数输出

  • 给你n个整数,每一个数字是0到10的九次方,然后你找到它的中位数进行输出
    • 如果序列是偶数,有以下两种情况处理
      • 两数相等,随便输出一个
      • 两数不等,输出较小的一个
    • 如果的序列是奇数,直接输出中间值。
  • 持续输出,直到输出整个序列!

输入样例

  • 5
  • 1 2 3 4 5

输出样例

  • 3 2 4 1 6
个人实现
  • 这里使用对顶堆实现,不过我花了很多时间,不应该是这样的!
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int count = in.nextInt();PriorityQueue<Integer> front = new PriorityQueue<>(Comparator.reverseOrder());PriorityQueue<Integer> back = new PriorityQueue<>();for(int i = 0;i < count ;i ++)  back.add(in.nextInt());while(!front.isEmpty() || !back.isEmpty()){while(front.size() < back.size()){front.add(back.poll());}if(front.size() == back.size()){if(front.peek() < back.peek()){System.out.print(front.poll() + " ");}else {System.out.print(back.poll() + " ");}}else{System.out.print( front.poll()+ " ");}}}
}

在这里插入图片描述

二次幂和三次幂序列

  • 先给一个数字n,n = 3 x 0 ∗ 2 y 0 3^{x_0}* 2^{y_0} 3x02y0 + 3 x 1 ∗ 2 y 1 3^{x_1}* 2^{y_ 1} 3x12y1 + 3 x 2 ∗ 2 y 2 3^{x_2}* 2^{y_2} 3x22y2,然后将上述每一个子项按照从小到大进行排序,输出对应序列为{ 3 x 0 ∗ 2 y 0 3^{x_0}* 2^{y_0} 3x02y0 3 x 1 ∗ 2 y 1 3^{x_1}* 2^{y_ 1} 3x12y1 3 x 2 ∗ 2 y 2 3^{x_2}* 2^{y_2} 3x22y2},不要求找一个最短的,只要能够输出就行。不如说10 = 3 0 ∗ 2 3 3^{0}* 2^{3} 3023 + 3 0 ∗ 2 1 3^{0}* 2^{1} 3021,输出的序列是{2,8},只要输出一个就行了!
  • n的数字范围是1到10的9次方。
个人实现
  • 这道题当时没有写完,但是有了基本的思路,使用最基本的回溯实现。
  • 我很懊恼呀,明明能够写出来的,我一开始误认为是零一背包,然后整了半天,发现还是得回溯,还是编程得速度不够快,当时没有想清楚,不应该!属实不应该!就是应该多练习一下!
import java.util.Scanner;
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static boolean dfs(int num,Map<Integer,Boolean> map,List<Integer> res){if(num == 0){Collections.sort(res,Collections.reverseOrder());for(int i = 0; i < res.size(); i++) {System.out.print(res.get(i) + " ");}System.out.println();return true;}for(int x:map.keySet()){if(map.get(x) == true && x <= num){res.add(x);map.put(x,false);if(dfs(num - x,map,res)) return true;res.remove(res.size() - 1);map.put(x,true);}}return false;}public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();// define two arrays to store the exp of 2 and 3int[] exp2 = new int[31];for(int i = 0; i < 31; i++) {exp2[i] = (int)Math.pow(2, i);}int[] exp3 = new int[19];for(int i = 0; i < 18; i++) {exp3[i] = (int)Math.pow(3, i);}//  define the map to store the numMap<Integer,Boolean> map = new HashMap<>();for(int i = 0; i < 31; i++) {for(int j = 0; j < 18; j++) {if((long)exp2[i] * (long)exp3[j] <= Integer.MAX_VALUE)map.put(exp2[i] * exp3[j], true);}}// find the resList<Integer> res = new ArrayList<>();dfs(num,map,res);}
}

捶胸顿足,难受,差不多都做出来了,但是时间没有安排好,还有就是写的太慢了!是什么让你写的那么慢?

  • 不确定使用哪种数据结构,然后来回切换两种方法==》对于回溯还不够熟悉!
  • 对于相关函数还不够熟悉!

总结

  • 练习题做了蛮长时间的,不过好在都做出来了,还是得加快编码的速度!加油!

  • 今天做了,还是蛮失望的,没想到有那么多选择题,考察面很广,实际上用来做算法题的时间并不多,最终效果做的一般!

    • 第一题,五分钟写完了,但是只能通过27%的样例,花了半个小时改,最终没什么效果
    • 第二题,半个小时写完,但是通过百分之八十的样例,后来花时间重写了对顶堆,然后的通过了所有样例,花的时间有点久!不应该!
    • 第三题,没写出来,应该是使用回溯做出来的!但是没写出来,时间太短了!现在五分钟就写出来了!但凡平和的心态再来五分钟,我就能写完!肯定能够写完!
  • 暴露出两个问题

    • 题目写少了,对于很多Java的方法还不熟悉,比如说isEmpty不是Empty还在这整半天
    • 然后回溯类的题型刷少了,不应该,后续把回溯全部刷完!
    • 回溯和动态规划就是可以相互转换的!

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

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

相关文章

HJ99 自守数

HJ99 自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数 数据范围&#xff1a; 1≤&#x1d45b;≤10000 1≤n≤10000 输入描述&#xff1a; i…

基于Matlab的数据可视化

基于Matlab的数据可视化 一、二维图形的绘制&#xff08;一&#xff09;基本图形函数&#xff08;1&#xff09;plot函数&#xff08;2&#xff09;fplot函数&#xff08;3&#xff09;其他坐标系的二维曲线 &#xff08;二&#xff09;图形属性设置&#xff08;1&#xff09;线…

c++应用网络编程之四Linux常用的网络IO模型

一、网络IO模型的实际应用 在前面学习了基本的网络IO模型&#xff0c;那么这种抽象的网络IO模型如何在实际的编程中应用呢&#xff1f;这其实就是理论与实际如何产生联系的一个过程。在现实世界中&#xff0c;有了理论的指导&#xff0c;下一步就是要把相关的理论如何与具体的…

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&…

C#中的栈和队列

什么是栈 栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到眼制。栈的操作只能在表的一端进行,队列的插入操作在表…

安卓篇-unidbg初步测试

前言:目前app的进度是c层的md5魔改 已经做好,又套了一层java层的加密。刚好可以再熟悉一下unidbg 最新版的app ,作为demo测试一下。 分析先看下app 的反编译的结果,很明显,源码很清晰 ,之前的混淆方式一点用没有。 然后跳过去 /* loaded from: classes4.dex */ public c…

HALCON数据结构

一、HALCON数据结构简介 1、HALCON中有两类参数&#xff1a;图形参数和控制参数。 2、HALCON算子参数中&#xff0c;图形输入参数、图形输出参数、控制输入参数和控制输出参数。 3、图形参数有&#xff1a;图像(image)、区域(region)和轮廓(XLD) 4、控制参数有&#xff1a;…

FPGA实验5:4位加法计数器

实验目的及要求 掌握时钟信号、进程和BUFFER端口的运用&#xff1b;了解计数器的设计、仿真和硬件测试&#xff0c;进一步熟悉VHDL语句、语法及应用等。 实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计4位加法计数器&#xff0c;进行波形仿真和分析、引脚分配…

人工智能与机器学习原理精解【2】

文章目录 机器学习基础一般化流程回归线性回归julia实现最小二乘法原理最小二乘法的原理线性回归中的最小二乘法最小二乘法的优点与局限性最小二乘法算法过程一、线性回归模型二、目标函数三、求解算法四、算法步骤四、计算公式五、注意事项 回归理论概述回归的基本概念回归模型…

4 Java的基本程序设计结构(基本语法3)- 字符串、面向对象(进阶)

文章目录 前言一、java中的 究竟比较的是什么&#xff1f;二、字符串1 String&#xff08;1&#xff09;String的两种构造方式&#xff08;2&#xff09;字符数组转字符串、字节数组转字符串&#xff08;3&#xff09;字符串的 拼接&#xff08;4&#xff09;字符串的内存结构…

2024睿抗机器人开发者大赛CAIP编程赛题解(c++)

题目地址(补题) PTA | 程序设计类实验辅助教学平台 RC-u1 热҈热҈热҈ 简单模拟题&#xff0c;没什么好说的 : #include<bits/stdc.h> using namespace std ; const int N 55 ;int a[N] ;int main(){int n , w ; cin >> n >> w ;for(int i1;i<n;i)…

【Android面试八股文】荣耀面试算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵

文章目录 1. 算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵1.1 题目描述1.2 算法实现1.2.1 步骤说明:1.2.2 算法实现1.2.3 代码实现:1.2.4 程序说明:1.2.5 示例详细讲解如何将一个矩阵顺时针旋转90度1. 算法题:输入一个N阶方…

Spring -- 三层架构

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

Oracle小白菜鸟从入门到精通教程

前言 Oracle公司&#xff08;甲骨文&#xff09;是全球最大的信息管理软件及服务供应商&#xff0c;成立于1977年&#xff0c;总部位于美国加州Redwood shore&#xff0c;面向全球开放oracle认证。Oracle开发的关系数据库产品因性能卓越而闻名&#xff0c;Oracle数据库产品为财…

Hi6274 反激式20瓦电源芯片

HI6274为高性能多模式 PWM 反激式20瓦电源芯片。HI6274较少的外围元器件、较低的系统成本可设计出高性能的"无Y"开关电源。HI6274提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、过载保护、软启动、芯片过温保护、可编程输出过压保护功能…

云原生项目纪事系列 - 项目管理的鲜活事例

大规模云原生系统的新颖性、建设性和挑战性&#xff0c;吸引着许多有数学思想、哲学意识和美学观念的系统架构师&#xff0c;老模也是其中一员。 老模即是文史家庭出身&#xff0c;又有理工学业背景&#xff0c;他基于平时记录的翔实细节&#xff0c;秉持客观原则&#xff0c;使…

【Langchain大语言模型开发教程】记忆

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Langchain的历史记忆 ConversationBufferMemory 2、基于窗口限制的临时记忆 ConversationBufferWindowMemory 3、基于Token数量的临时记忆 ConversationTokenBufferMemory 4、基于历史…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

【Webpack】提高打包速度

升级 webpack 版本&#xff1a;Webpack 不断更新优化打包速度&#xff0c;升级到最新版本可以获得更好的性能。 减少模块解析范围&#xff1a;通过设置resolve.modules、resolve.extensions、resolve.alias等选项&#xff0c;可以让Webpack减少查找和解析模块的范围&#xff0…

《从C/C++到Java入门指南》- 17.命令行参数

命令行参数 一直写代码的童鞋可能留意到了&#xff0c;main函数中会传入一个String args[]的字符串数组。 这个数组由JVM接收用户输入并传给main函数。 import java.util.*; public class Main {public static void main(String[] args) {for (String arg : args) {System.out…