1、java数组定义


1、与其他高级语言不同,Java在数组声明时并不为数组分配存储空间,因此,在声明的[]中不能指出数组的长度

2、为数组分配空间的两种方法:数组初始化和使用new运算符

3、未分配存储空间时,数组变量中只是一个值为null的空引用,要访问数组元素,必须需要经过初始化、分配存储空间创建数组后才能访问数组的元素

  一维数组定义:

int[] arr;  //注意int[5] arr;错误int arr[];int[] arr = {1, 2, 3, 4, 5}; int[] arr = new int[5];

  二维数组定义:

  二维数组即是特殊的一维数组,每个元素是一个一维数组

int[] arr[]; //此种方式最好理解int arr[][];int[][] arr;int arr[][] = {{1,2},{3,4},{5,6,7}};int arr[][] = new int[3][3]

2. 二进制数种1的位数


注意:

1. 方式一通过右移计算,如果是负数右移时高位会补充0,此时可能会进入死循环

如4(100)返回1, 9(1001)返回2

public class BitCount {//方式一:移位加计数器  注意java中没有无符号整形public static int bitCount(int n){ int count = 0; while(n > 0){ if((n & 1) == 1){ count++; } n >>= 1; } return count; }

public static int bitCount1(int n){int count = 0; unsigned int flag = 1; while(flag){ if(n&flag){ count++; } flag = flag << 1; } return count; }

    //方式三:使用n = n & (n-1)public static int bitCount2(int n){ int count = 0; while(n > 0){ n &= n-1; //消除最右边的1,和第一种方式等价,只是这个的执行次数由数字中的1决定 count++; } return count; }

    public static void main(String[] args) {System.out.println("3: "+ bitCount(3));System.out.println("8: "+ bitCount(8)); System.out.println("11: "+ bitCount(11)); System.out.println("6: "+ bitCount2(6)); System.out.println("7: "+ bitCount2(7)); System.out.println("13: "+ bitCount2(13)); } }

输出:

3: 2
8: 1
11: 3
6: 2
7: 3
13: 3

http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 中提供了很多其他很巧妙的方法

3.无序数组中最小的10个数


需要考虑数组是否可以修改

1)如果数组可以修改, 时间复杂度O(n)

可以参考快速排序的思路,基于数组的第k个数字来排序,使得比k小的所有数字排在数组的左边,比k大的数字排在数组的右边;另外这种方式找出的前k个数不一定是有序的

借用快速排序中partition函数

public static int partition(int[] data, int start, int end){ if(data == null || start < 0 || end >= data.length){ throw new InvalidParameterException(); } Random rand = new Random(); int index = rand.nextInt(end-start+1)+start; swap(data, index, end); int borderPos = start-1; //记录小于部分和大于部分的分界点,指向最后一个小于的值 for(index = start; index < end; ++index){ if(data[index] < data[end]){ borderPos++; if(borderPos != index){ swap(data, borderPos, index); } } } borderPos++; swap(data, borderPos, end); return borderPos; } public static void swap(int[] data, int pos1, int pos2){ int tmp = data[pos1]; data[pos1] = data[pos2]; data[pos2] = tmp; }

查找最小的前k个数

    public static int[] getSmallestNum(int[] numbers, int k){ if(numbers == null || k <= 0 || k > numbers.length){ throw new InvalidParameterException(); } int start = 0, end = numbers.length -1, index = partition(numbers, start, end); while(index != k-1){ if(index > k-1){ end = index - 1; index = partition(numbers, start, end); }else{ start = index + 1; index = partition(numbers, start, end); } } int[] result = new int[k]; for(int i = 0; i < k; i++){ result[i] = numbers[i]; } return result; } 

测试:

public static void main(String[] args) {int[] arr = new int[20]; for(int i=0; i<20; i++){ arr[i] = (int) (Math.random()*100); } for(int i=0,len=arr.length; i<len; i++){ System.out.print(arr[i]+" "); } int[] result = getSmallestNum(arr,5); System.out.println(""); for(int i=0,len=result.length; i<len; i++){ System.out.print(result[i]+" "); }

输出:

91 69 75 29 69 55 80 44 63 19 36 53 62 45 97 52 8 93 34 38
29 19 8 34 36 

2) 使用大根堆

使用大根堆存储最小的k个数,将前k个数读入堆中,剩下的数据和堆中的最大值比较,小于最大值即替换最大值,如果比最大值大,丢弃该值,,大根堆的插入和删除时间复杂度为O(logk),因而整体的时间复杂度为O(nlogk)

此种方式不用更改数组,并且适合处理海量数据

    public static int[] getSmallestNums1(int[] numbers, int k){ //参数检查 if(numbers == null || k <= 0){ throw new InvalidParameterException(); } //存储大根堆,初始值为numbers的前k个数 int[] heap = new int[k]; for(int i = 0; i < k; i++){ heap[i] = numbers[i]; } int rootIndex = k/2 -1; while(rootIndex >= 0){ reheap(heap, rootIndex, k-1); rootIndex--; } for(int i = k, len = numbers.length; i < len; i++){ //如果数值比最大值小,替换最大值 if(numbers[i] < heap[0]){ heap[0] = numbers[i]; reheap(heap, 0, k-1); } } return heap; } //重建大根堆 public static void reheap(int[] heap, int rootIndex, int end){ int node = heap[rootIndex]; int leftIndex = rootIndex*2 +1; boolean done = false; while(!done && leftIndex <= end){ int index = leftIndex; if(leftIndex+1 <= end){ int rightIndex = leftIndex + 1; if(heap[rightIndex] > heap[leftIndex]){ index = rightIndex; } } if(node < heap[index]){ heap[rootIndex] = heap[index]; rootIndex = index; leftIndex = rootIndex*2 + 1; }else{ done = true; } } heap[rootIndex] = node; }

测试:

public static void main(String[] args) {int[] arr = new int[20]; for(int i=0; i<20; i++){ arr[i] = (int) (Math.random()*100); } for(int i=0,len=arr.length; i<len; i++){ System.out.print(arr[i]+" "); } int[] result = getSmallestNums1(arr,5); System.out.println(""); for(int i=0,len=result.length; i<len; i++){ System.out.print(result[i]+" "); } }

输出:

91 13 44 34 3 57 62 89 57 62 45 1 40 71 76 18 1 28 32 55
18 13 1 1 3 

转载于:https://www.cnblogs.com/jianmang/articles/4879013.html

20140704笔试面试总结(java)相关推荐

  1. 修作玉颜色,卖于帝王家(java笔试面试—-求职经历)

    文时至今日方才起笔,不知为何,曾经在奔跑的过程中,无数次的提醒自己,等正式卖完身之后一定要写下这篇文章,来纪念过去的时日,一为警惕自身,二为温馨提示后人.但已经卖身快两个月了,还是无法真正地写下一纸半 ...

  2. Java笔试面试(社招版)

    一.并发 Java面试–线程池 Java面试–ThreadLocal Java面试–乐观锁和悲观锁 Java面试–线程的生命周期状态 Java面试–Synchronized Java面试–wait和s ...

  3. 面试总结----java初级工程师

    最近在找java初级工程师的工作,投了很多简历都没有反馈,只收到了几个面试通知,可能是因为工作年限和项目经历都不是很丰富,另外一个原因可能是之前接触的技术不新,对于现在想进互联网公司来说,技术上不太符 ...

  4. python 笔试题 英方_4000字转型数据分析师笔试面试经验分享

    大家好,我是戴师兄~ 在上一篇文章中我分享了快速自学数据分析的经验. 本篇文章,我将跟大家分享下我的笔试和面试心得. 开头先说说我转型前的职业背景: 想看笔试面试经验的同学萌可以直接跳过这一段~ 20 ...

  5. 面试 | #面试面试面试 做#Java 就是要这种不要脸的…

    Hi! 我是小小,今天是本周的第二篇,昨天的阅读量效果不好,小小在此道歉,开始本周的第二篇. 公司到底需要什么样的Java人才,嗯,对,公司就是需要这种不要脸的Java人才,小小从茫茫人海中,找到了一 ...

  6. 46家中外知名企业笔试面试题目

    http://blog.sina.com.cn/s/blog_4897add3010009wj.html 微软 智力题 1.烧一根不均匀的绳子,从头烧到尾总共需要1个小时,问如何用烧绳子的方法来确 定 ...

  7. 九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试六十题

    九月迅雷,华为,阿里巴巴,最新笔试面试十题 8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面 ...

  8. 最新校招笔试面试六十题

    原文: 九月十月百度,迅雷,华为,阿里巴巴最新校招笔试面试六十题(11.05) 链接:http://blog.csdn.net/v_july_v/article/details/11921021 分类 ...

  9. 腾讯 美团 百度 网易游戏 2015校园招聘南京笔试面试之总结分析

    补充(20141106): 三方已经寄出,综合评价下自己的不足和OFFER分析. 网易游戏终面 10月28号,网易游戏定好了往返的飞机票让我去广州参加终面,事前我对技术准备还是挺充分的,可对网易游戏本 ...

最新文章

  1. [原]SSL 开发简述(Delphi)
  2. entjs 键盘监听
  3. C# DataGridView控件用法
  4. ​知乎700万人围观:如何快速成为数据分析师?
  5. gdal 压缩tif_Python | GDAL处理影像
  6. Real提示“作为受限用户,您无足够的windows操作权限”的解决办法
  7. acl 服务器编程框架特点介绍
  8. 如何让我的mfc应用程序可以在最上面?
  9. while正逆序的测试结果
  10. 使用python编程数学建模-Python的特点及优缺点(课程1)
  11. 软件测试面试题(面试前准备篇)
  12. 腾讯企业邮箱接收服务器pop,腾讯企业邮箱POP,SMTP分别是什么(示例代码)
  13. 做人最大的无知,是错把平台当本事(深度好文)
  14. spring-boot mybadis多数据源配置
  15. 学简单python好学吗_python好学吗? 语法简单吗? 举个例子?
  16. MACbook Air 装win7 步骤
  17. 【异地贷款】长三角住房公积金异地贷款流程记录
  18. Linux内核2.6.34.14添加系统调用及编译方法(CentOS-6.4-x86_64)
  19. Python中NaN、nan和NAN的区别及使用方法
  20. [CM311-1A]- Android 文件/目录 管理

热门文章

  1. labelimg标注工具使用
  2. 网络编程(一)基础知识
  3. pads元件类型如何修改_pads logic元件库修改了,怎样更新到原理图
  4. code block怎样实现图形界面_Python 代码实现验证码识别,很稳
  5. java模拟手机浏览web_PC上测试移动端网站和模拟手机浏览器
  6. matlab 迭代时保存每次迭代数据,Matlab 迭代步数据保存问题.
  7. VUE 调试神器 vue-devtools
  8. 开机更新配置怎么关闭计算机,Win7关闭开关机的Windows Update配置()制作方法
  9. linux学习查看日志命令
  10. 渗透测试入门16之渗透测试基本知识