算法题存档20190127
题目描述
假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙
输入描述:
迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N
后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。
输出描述:
路径的长度,是一个整数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;public class Main {static int[][] next={{-1,0},{0,-1},{1,0},{0,1}};public static void main(String[] args) throws IOException {InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String[] mn = String.valueOf(bufferedReader.readLine()).split(" ");int m = Integer.parseInt(mn[0]);int n = Integer.parseInt(mn[1]);String[] tempArray = new String[m];for(Integer i = 0; i < m; i++) {tempArray[i] = bufferedReader.readLine();}char[][] mnArray = new char[m][n];Integer startX = 0;Integer startY = 0;for(int i = 0; i < m; i++) {if(tempArray[i].contains("2")) {startX = i;startY = tempArray[i].indexOf("2");}mnArray[i] = tempArray[i].toCharArray();}Integer result = step(startX, startY, m, n, mnArray);System.out.println(result);}public static Integer step(Integer x, Integer y, Integer m, Integer n, char[][] mnArray) {Queue<StepNode> stepQueue = new LinkedList<>();stepQueue.offer(new StepNode(x,y,0,0));byte[][][] arrived = new byte[m][n][1024];while(!stepQueue.isEmpty()) {StepNode stepNode = stepQueue.poll();for(int i = 0; i < 4; i++) {int[] nextNode = next[i];int nextX = nextNode[0];int nextY = nextNode[1];int stepX = stepNode.x + nextX;int stepY = stepNode.y + nextY;int step = stepNode.step;int key = stepNode.key;if(stepX < 0 || stepY < 0 || stepX > m - 1 || stepY > n - 1|| mnArray[stepX][stepY] == '0') {continue;}if(mnArray[stepX][stepY] >= 'a' && mnArray[stepX][stepY] <= 'z') {int index = mnArray[stepX][stepY] - 'a';key |= 1 << index;}if(mnArray[stepX][stepY] >= 'A' && mnArray[stepX][stepY] <= 'Z') {int index = mnArray[stepX][stepY] - 'A';if(((key >> index) & 1) == 0) {continue;}}if(mnArray[stepX][stepY] == '3') {return step + 1;}if(arrived[stepX][stepY][key] == 0) {arrived[stepX][stepY][key] = 1;stepQueue.offer(new StepNode(stepX, stepY, step + 1, key));}}}return -1;}class StepNode {int x;int y;int step;int key;public StepNode(int x, int y, int step, int key) {this.x = x;this.y = y;this.step = step;this.key = key;}}
}
题目描述
六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能将多块巧克力分给一个孩子或将一块分给多个孩子。
输入描述:
第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素
输出描述:
上台表演学生人数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;public class Main {public static void main(String[] args) throws IOException {Integer result = 0;InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);Integer n = Integer.valueOf(bufferedReader.readLine());String[] h = String.valueOf(bufferedReader.readLine()).split(" ");Integer[] hArray = new Integer[n];for (int i = 0; i < h.length; i++) {hArray[i] = Integer.valueOf(h[i]);}Integer m = Integer.valueOf(bufferedReader.readLine());String[] w = String.valueOf(bufferedReader.readLine()).split(" ");Integer[] wArray = new Integer[m];for (int i = 0; i < w.length; i++) {wArray[i] = Integer.valueOf(w[i]);}Arrays.sort(hArray);Arrays.sort(wArray);Integer now = 0;end:for (Integer chw : wArray) {for (int index = now; index < n; index++) {if (hArray[index] <= chw) {result++;now = index + 1;break;}if (index == n) {break end;}}}System.out.println(result);}}
题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;public class Main {public static void main(String[] args) throws IOException {InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);int number = Integer.valueOf(bufferedReader.readLine());String[] str = bufferedReader.readLine().split(" ");int[] array = new int[str.length];for (int i = 0; i < array.length; i++) {array[i] = Integer.parseInt(str[i]);}if (array.length == 3) {System.out.println(array[0] * array[1] * array[2]);return;}ArrayList<Integer> plus = new ArrayList(array.length);ArrayList<Integer> minus = new ArrayList(array.length);for (Integer member : array) {if (member == 0) {continue;}if (member < 0) {int index = 0;for (; index < minus.size(); index++) {if (Math.abs(minus.get(index)) < Math.abs(member)) {Integer temp = minus.get(index);minus.set(index, member);member = temp;}}minus.add(member);} else {int index = 0;for (; index < plus.size(); index++) {if (Math.abs(plus.get(index)) < Math.abs(member)) {Integer temp = plus.get(index);plus.set(index, member);member = temp;}}plus.add(member);}}Long result = null;if (plus.size() >= 3) {result = Long.valueOf(plus.get(0)) * plus.get(1) * plus.get(2);}if (plus.size() >= 1 && minus.size() >= 2) {if (result == null) {result = Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0);} else {result = Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0) > result ? Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0) : result;}}if (result == null) {result = 0L;}System.out.println(result);return;}}
算法题存档20190127相关推荐
- 算法题存档20200505
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- 算法题存档20191223
题目描述 删除给出链表中的重复元素,使链表中的所有元素都只出现一次 例如: 给出的链表为1->1->2,返回1->2. 给出的链表为1->1->2->3->3 ...
- 算法题存档20190207
题目描述 如果一个整数只能被1和自己整除,就称这个数是素数. 如果一个数正着反着都是一样,就称为这个数是回文数.例如:6, 66, 606, 6666 如果一个数字既是素数也是回文数,就称这个数是回文 ...
- 算法题存档20200627(树)
给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表. 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 Tru ...
- 算法题存档2020425
给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3, ...
- 20191219算法题存档
题目描述 给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组 注意: 可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n public class ...
- 20190730算法题存档
题目描述 Given a singly linked list L: L 0→L 1→-→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→ ...
- 20190724算法题存档
题目描述 Sort a linked list in O(n log n) time using constant space complexity. public class Solution {p ...
- 20190719算法题存档
题目描述 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011.... 并且小Q对于能否被3整除这个性质很感兴趣. 小Q现在希望你能帮他计算一下从数 ...
最新文章
- 网络工程师_记录的一些真题_2005上半年上午
- 字符串(string类)
- 科普云计算知识,迎接云计算大会
- 定义一个不能被拷贝的类
- IT 语音 java hi_Java bithift陌生
- 33个非常有创意的404错误页面设计
- 【Java自顶向下】面试官:HashMap源码看过吗?我:看过!面试官:好极了,那么来扒一扒吧!
- 深入理解C++类的构造函数与析构函数
- 安卓入门系列-06常见布局之ConstraintLayout(约束布局)
- C++的一般引用及其数组引用
- dubbo协议_Dubbo框架支持多少种协议?各有什么特点?文中一一为你揭晓
- python将h264文件视频转为mp4格式
- Rockchip RK3288 Datasheet芯片手册资料
- SVN更新报the working copy needs to be upgraded解决办法
- 笔记本电脑计算机无法显示u盘,笔记本不识别u盘怎么办_笔记本电脑不读U盘如何解决-win7之家...
- 三种数据库的 SQL 注入详解
- 佛罗里达大学计算机科学专业排名,2019年南佛罗里达大学计算机科学专业排名情况如何?...
- java接口 运动员,JAVA面向对象进阶实例【教练和运动员日常安排】
- 利用Origin绘制等高线颜色填充图:初步绘制与细化
- 传说中让理科生沉默,让文科生落泪的文史综合题
热门文章
- Spring框架中IoC(控制反转)的原理
- null对象访问static属性或方法
- dos命令行设置网络优先级_网络安全之木马病毒的防范以及攻击
- C# OpenTK教程 - 1.1 创建窗口
- C#内将DataSet分页
- html5邀请函在线制作,很炫的html5年会邀请函
- 泽尼克多项式 matlab,zernike多项式 ---matlab程序 ---arrayfun.m函数
- PHP利用PDO从mysql读取大量数据处理(可做大量数据集的导出,业务调整等)
- 在 eclipse 中设置每行的字数
- 专题实验 字符集(全球化支持)