数据结构面试题

  • 常见的数据结构
  • 一. 数组
    • 1.寻找数组中第二大的元素
    • 2.寻找数组中不重复出现的整数
    • 3.实现数组中负数在左,正数在右
  • 二. 栈
    • 1.用栈计算后缀表达式
    • 2.对栈数据进行排序
    • 2.用栈来判断括号匹配问题
  • 三. 队列

常见的数据结构

  1. 数组
  2. 队列
  3. 链表
  4. 字典树(高效树形结构)
  5. 散列表(哈希表)

一. 数组

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. 《数据结构 》排序试题附答案

    <数据结构 >排序试题附答案 一.选择题 1.某内排序方法的稳定性是指(    ). A.该排序算法不允许有相同的关键字记录      B.该排序算法允许有相同的关键字记录 C.平均时间为 ...

  2. Java程序员面试笔试宝典-数据结构与算法(四)

    本文内容基于<Java程序员面试笔试宝典>,何昊.薛鹏.叶向阳著. 1. 链表 1.1 如何实现单链表的增删操作? 1.2 如何从链表中删除重复元素? 1.3 如何找出单链表中的倒数第k个 ...

  3. 中级JAVA程序员应该掌握的数据结构知识

    学习数据结构的重要性 程序=数据结构 + 算法,算法很重要,数据结构也很重要,只有掌握了这两者,我们才等于掌握了写程序的本领,才是合格的程序员哦. 算法复杂度比较 在网上看到的一篇总结,这个要背的. ...

  4. Java 程序员不得不会的 124 道面试题(含答案)

    多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变 ...

  5. 计算机软考 下午试题,2011年计算机软考程序员考试(下午题)模拟试题及答案(2)...

    下午试卷 (考试时间 14:00~16:30 共150分钟) 本试卷共8道题,考生需解答5道题,其中试题1~试题3是必答题,试题4和试题5两题任选1道题,试题6至试题8三题任选1道解答.对于任选题,如 ...

  6. 程序员趣味儿逻辑测题-2(附答案)这次的题稍难,快来挑战吧!

    佛祖的灯油被老鼠精偷吃了,悟空抓来四个女妖精来审问, 分别是:白骨精.蜘蛛精.玉兔精.老鼠精. 但是这些女妖精都会变化,悟空的火眼金睛也分不清哪个才是老鼠精. 于是对其中三个女妖进行了询问: 女妖A: ...

  7. 一文搞懂JVM架构:入职3个月的Java程序员面临转正

    Java基础 1.JAVA 中的几种数据类型是什么,各自占用多少字节. 2.String 类能被继承吗,为什么. 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true ...

  8. Java程序员,面试阿里Java开发你必需要先理解的题库!

    面试准备 不论是校招还是社招都避免不了各种面试.笔试,如何去准备这些东西就显得格外重要. 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 自我介绍.(介绍自己 ...

  9. java程序员求职计划_2017年java程序员面试经验(500字)

    1.数据结构 2.OO.按照他的一段描述建模 3.Java和C++在内存管理的不同之处. 4.JAVA的多线程机制. 5.反射机制的作用,以及在哪些方面使用了反射机制 6.网络 7.DesignPat ...

最新文章

  1. 图卷积神经网络(GCN)入门
  2. 计算机领域认知个人陈述,计算机专业个人陈述十九
  3. druid-StatViewServlet配置
  4. 【文件处理】——字典写入json文件或TXT文件,读取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable错误解决方法
  5. 【渝粤教育】电大中专学前儿童发展心理学3作业 题库
  6. Sentinel 连接数据源
  7. 判断字符串中是否包含中文
  8. 现代软件工程系列 结对编程 (II) 电梯调度程序
  9. priority_queueint,vectorint,greaterint优先队列,按照从小到大
  10. 【对讲机的那点事】450MHz模拟无线列调的工作原理(连载四)
  11. 89c51汇编语言流水灯,汇编语言流水灯
  12. HTTP详解(1)-工作原理
  13. 中国生物能源行业运行现状调研及未来发展前景预测报告2022-2028年版
  14. jsp文件上传图片到服务器
  15. 小世界网络和复杂网络+python代码实现
  16. WinCC Function TrendControl趋势图
  17. 姜小白的python日记day2 变量和循环
  18. 带你玩东方外传系列十一 ~ 二十游戏链接
  19. 离散数学 08.02 格的定义
  20. 主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程

热门文章

  1. Windows下使用VisualSFM + CMVS/PMVS +MeshLab进行三维重建
  2. 五行和五脏(《走近中医》摘抄)
  3. /proc/sys目录下各文件参数说明
  4. Unity实现屏幕淡入淡出效果
  5. photoshop工具使用的简单介绍
  6. 拉丁猪文字游戏(JAVA)
  7. 云创大数据助力秦淮区青少年暑期活动
  8. Spring事务隔离级别与设置
  9. pm3包1.8版本发布----一个用于3组倾向性评分的R包
  10. Spine事件 AnimationState回调