JAVA程序员必须掌握的数据结构的面试题(附答案)
数据结构面试题
- 常见的数据结构
- 一. 数组
- 1.寻找数组中第二大的元素
- 2.寻找数组中不重复出现的整数
- 3.实现数组中负数在左,正数在右
- 二. 栈
- 1.用栈计算后缀表达式
- 2.对栈数据进行排序
- 2.用栈来判断括号匹配问题
- 三. 队列
常见的数据结构
- 数组
- 栈
- 队列
- 链表
- 树
- 图
- 字典树(高效树形结构)
- 散列表(哈希表)
一. 数组
1.寻找数组中第二大的元素
//冒泡排序法public static void getMethod_1(int[] array){int temp = 0;int len = array.length;for(int i = 0;i<len;i++){if(i == len-1){break;}for(int j = i+1;j<len;j++){if(array[i]>=array[j])continue;else{temp = array[j];array[j] = array[i];array[i] = temp;}}}System.out.println(array[1]);}public static void main(String[] args) {getMethod_1(new int[]{1,2,3,9,8,7,5,6,-1,-2,-3,-9,-8,-7,-5,-6});}
2.寻找数组中不重复出现的整数
//有且只有一个数字不重复public static int getMethod_2(int[] array){int len = array.length;int res = -1;if(len>1){res = array[0];for(int i = 1;i<len;i++){res = res^array[i];}}return res;}//有多个不重复数字,找出所有不重复数字public static ArrayList<Integer> getMethod_3(int[] array){ArrayList<Integer> res = new ArrayList<Integer>();if(array==null||array.length<2)return res;Map<Integer,Integer> map = new LinkedHashMap<>();for(int i = 0;i<array.length;i++){if(map.containsKey(array[i]))map.put(array[i],map.get(array[i])+1);elsemap.put(array[i], 1); }for(Integer key : map.keySet()){if(map.get(key) == 1)res.add(key);}return res;}//寻找数组中第一个不重复出现的字符public static char findFirst(String str) {if (str == null || str.length() == 0)return '#';int[] hashtable = new int[256];int len = str.length();char[] arr = str.toCharArray();for (int i = 0; i < len; i++) {hashtable[arr[i]]++;}for (int i = 0; i < len; i++) {if (hashtable[arr[i]] == 1)return arr[i];}return '#';}public static void main(String[] args) {//不重复的数字只有一个,找到这个数int number = getMethod_2(new int[]{1,1,1,1,1,1,1,1,1,-2,1,1,1});System.out.println(number);//寻找数组中第一个不重复出现的整数ArrayList<Integer> number_3 = getMethod_3(new int[]{8,7,5,6,-1,-2,-3,-9,-8,-7,-5,-6,1,2,3,9,8});System.out.println(number_3.size()>0?number_3.get(0):"没有找到不重复数字");}
3.实现数组中负数在左,正数在右
/*** 方式一* 实现原理是:两个变量记录左右节点,两边分别开始遍历。左边的节点遇到负值继续前进,遇到正值停止。右边的节点正好相反。 * 然后将左右节点的只进行交换,然后再开始遍历直至左右节点相遇。 * 这种方式的时间复杂度是O(n).空间复杂度为O(1)* @param a 要排列数组* @param left 左开始索引* @param right 右开始索引*/public static void setParted1(int[] a, int left, int right) {if (left >= right || left == a.length || right == 0) {for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}return;}while (a[left] < 0) {left++;}while (a[right] >= 0) {right--;}if (left >= right || left == a.length || right == 0) {for (int i = 0; i < a.length; i++) {System.out.print(a[i]+"\t");}System.out.println();return;}swap(a, left, right);left++;right--;setParted1(a, left, right);}private static void swap(int a[], int left, int right) {int temp = 0;temp = a[left];a[left] = a[right];a[right] = temp;}/*** 方式二*/public static void setParted(int[] a) {int temp = 0;int border = -1;for (int i = 0; i < a.length; i++) {if (a[i] < 0) {temp = a[i];a[i] = a[border + 1];a[border + 1] = temp;border++;}}for (int j = 0; j < a.length; j++) {System.out.print(a[j]+"\t");}System.out.println();}public static void main(String[] args) {int a[] = { 1, 2, -1, -5, -6, 7, -7, -10 };int b[] = {8,7,-1,-2,-3,-9,-8,-7,2,3,9,8};setParted(a);setParted1(b,0,b.length-1);}
二. 栈
1.用栈计算后缀表达式
private static final char ADD = '+';private static final char SUB = '-';private static final char MUL = '*';private static final char DIV = '/';private static Stack<Integer> stack = new Stack<Integer>();/*** 后缀表达式就是:操作符位于两个操作数之后,后缀表达式的形式如下:<操作数><操作数><操作符>* 中缀表达式就是:操作符位于操作数之间。中缀表达式的形式如下:<操作数><操作符><操作数>*/public static int evaluate(String expr){// 将字符串分解,\s 匹配任何空白字符,包括空格、制表符、换页符等。String[] tokenizer = expr.split("\\s");// for(int i = 0;i<tokenizer.length;i++){String token = tokenizer[i].trim();if(isOperator(token)){ // 判断是操作符,则出栈两个操作数int op2 = stack.pop().intValue();int op1 = stack.pop().intValue();char operator = token.charAt(0);stack.push(calc(operator,op1,op2));}else{stack.push(Integer.parseInt(token));}}return stack.pop(); // 将最后的计算结果返回}private static Integer calc(char operation, int op1, int op2) {int result = 0;switch (operation) {case ADD:result = op1 + op2;break;case SUB:result = op1 - op2;break;case MUL:result = op1 * op2;break;case DIV:result = op1 / op2;break;}return result;}private static boolean isOperator(String token) {return (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"));}public static void main(String[] args) {String expression = "3 2 2 * + 1 -";int result = evaluate(expression);System.out.println("计算结果为:" + result);}
2.对栈数据进行排序
//双栈排序public Stack<Integer> twoStackSort(Stack<Integer> s){Stack<Integer> stack = new Stack<Integer>();while(!s.isEmpty()){int tmp = s.pop();while(!stack.isEmpty() && stack.peek() > tmp){s.push(stack.pop());}stack.push(tmp);}return stack;}public static void main(String[] args) {Stack<Integer> stack = new Stack<Integer>();stack.push(5);stack.push(4);stack.push(7);stack.push(8);stack.push(6);stack.push(1);stack.push(9);stack.push(2);stack.push(3);Stack<Integer> stack2 = twoStackSort(stack);System.out.println(stack2);}
2.用栈来判断括号匹配问题
public static boolean isValidate(String s){Stack<Character> a = new Stack<Character>();for(int i = 0 ;i<s.length();i++){char c = s.charAt(i);if(c=='(')a.push(')');if(c=='[')a.push(']');if(c=='{')a.push('}');if(c == ')' || c == ']' || c == '}'){if(a.size()==0)return false;if(a.pop()!=c)return false;}}if(a.size()!=0)return false;return true;}public static void main(String[] args) {//判断括号匹配问题String s = "..(..(..[]..)..)";boolean a = isValidate(s);System.out.println(a);}
三. 队列
JAVA程序员必须掌握的数据结构的面试题(附答案)相关推荐
- 《数据结构 》排序试题附答案
<数据结构 >排序试题附答案 一.选择题 1.某内排序方法的稳定性是指( ). A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为 ...
- Java程序员面试笔试宝典-数据结构与算法(四)
本文内容基于<Java程序员面试笔试宝典>,何昊.薛鹏.叶向阳著. 1. 链表 1.1 如何实现单链表的增删操作? 1.2 如何从链表中删除重复元素? 1.3 如何找出单链表中的倒数第k个 ...
- 中级JAVA程序员应该掌握的数据结构知识
学习数据结构的重要性 程序=数据结构 + 算法,算法很重要,数据结构也很重要,只有掌握了这两者,我们才等于掌握了写程序的本领,才是合格的程序员哦. 算法复杂度比较 在网上看到的一篇总结,这个要背的. ...
- Java 程序员不得不会的 124 道面试题(含答案)
多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变 ...
- 计算机软考 下午试题,2011年计算机软考程序员考试(下午题)模拟试题及答案(2)...
下午试卷 (考试时间 14:00~16:30 共150分钟) 本试卷共8道题,考生需解答5道题,其中试题1~试题3是必答题,试题4和试题5两题任选1道题,试题6至试题8三题任选1道解答.对于任选题,如 ...
- 程序员趣味儿逻辑测题-2(附答案)这次的题稍难,快来挑战吧!
佛祖的灯油被老鼠精偷吃了,悟空抓来四个女妖精来审问, 分别是:白骨精.蜘蛛精.玉兔精.老鼠精. 但是这些女妖精都会变化,悟空的火眼金睛也分不清哪个才是老鼠精. 于是对其中三个女妖进行了询问: 女妖A: ...
- 一文搞懂JVM架构:入职3个月的Java程序员面临转正
Java基础 1.JAVA 中的几种数据类型是什么,各自占用多少字节. 2.String 类能被继承吗,为什么. 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true ...
- Java程序员,面试阿里Java开发你必需要先理解的题库!
面试准备 不论是校招还是社招都避免不了各种面试.笔试,如何去准备这些东西就显得格外重要. 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 自我介绍.(介绍自己 ...
- java程序员求职计划_2017年java程序员面试经验(500字)
1.数据结构 2.OO.按照他的一段描述建模 3.Java和C++在内存管理的不同之处. 4.JAVA的多线程机制. 5.反射机制的作用,以及在哪些方面使用了反射机制 6.网络 7.DesignPat ...
最新文章
- 图卷积神经网络(GCN)入门
- 计算机领域认知个人陈述,计算机专业个人陈述十九
- druid-StatViewServlet配置
- 【文件处理】——字典写入json文件或TXT文件,读取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable错误解决方法
- 【渝粤教育】电大中专学前儿童发展心理学3作业 题库
- Sentinel 连接数据源
- 判断字符串中是否包含中文
- 现代软件工程系列 结对编程 (II) 电梯调度程序
- priority_queueint,vectorint,greaterint优先队列,按照从小到大
- 【对讲机的那点事】450MHz模拟无线列调的工作原理(连载四)
- 89c51汇编语言流水灯,汇编语言流水灯
- HTTP详解(1)-工作原理
- 中国生物能源行业运行现状调研及未来发展前景预测报告2022-2028年版
- jsp文件上传图片到服务器
- 小世界网络和复杂网络+python代码实现
- WinCC Function TrendControl趋势图
- 姜小白的python日记day2 变量和循环
- 带你玩东方外传系列十一 ~ 二十游戏链接
- 离散数学 08.02 格的定义
- 主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程