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

20140704笔试面试总结(java)的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. java笔试面试第一天

    好久未曾启用我的博客,最近来上海找工作,想将笔试面试的过程做个记录,毕竟有总结才有提高嘛.今天算是笔试面试正式开始第一天吧,以下就是我的笔试总结(没有原题了,只有知识点): 笔试题1:java sta ...

  3. Java 笔试面试(6)异常处理

    Java 笔试面试(6)异常处理 1. finally的代码何时执行? 问题描述:try{}里有一个return语句,那么在这个try后面的finally{}中的代码是否为执行?如果会,是在retur ...

  4. 找工作笔试面试那些事儿(16)---linux相关知识点(1)

    linux这部分的知识倒不是笔试面试必考的内容,不过现在很多公司开发环境都在linux系统下,一些简单的知识还是需要了解一下的,笔试面试中万一碰到了,也不会措手不及.作为菜硕的我,又因为读研期间的项目 ...

  5. Web前端开发笔试&面试_01(mi:)

    —— (al_me16041719002000) begin—— 1.(单选)下面哪个方法是String对象和Array对象都有的? A.splice B.split C.replace D.conc ...

  6. java_面试_01_一个月的面试总结(java)

    重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...

  7. C++常见笔试面试要点以及常见问题

    1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...

  8. catalan数及笔试面试里那些相关的问题(转)

    一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...

  9. php 笔试面试 总结

    一次小小的笔试面试经历,虽然是一些简单的问题,但是自己在这儿总结一下,也查一些资料,得出一些较好的答案,也能帮助自己成长. 1.自己熟悉的http状态码及其意义 其实这个题答案随处可见.这儿也还是记录 ...

随机推荐

  1. bootstrap3.0 模态框显示的文字超出怎么办

    版本:bootstrap3.3 模态框文字超出 解决方案: 在html中控制自动换行   其实只要在表格控制中添加一句<div style="word-break:break-all& ...

  2. Activity是如何挂载Pargment的Day35

    Activity是如何挂载Pargment的Day35 mebile5.0 1.Fragment优化早上任务 思路 一个主Activity 短信群发器 中秋给朋友发短信,都能够加上他们的姓名,这样他们 ...

  3. 1.redis.3.2 下载,安装、配置、使用 - 1

    1.下载:   2.使用: 挤压之后,使用cmd执行,如下图 redis-server--service-installredis.windows.conf,执行安装 提示成功之后,剩下就好办了, 这 ...

  4. A题笔记(5)

    No. 1385 挤牛奶问题 Tips: 查找之前对数据进行一下排列会比较好; 两个“最长”放在一趟遍历里查找. class LT { public: int bt; int ct; int dura ...

  5. GET请求和POST请求

    A:有哪些get请求呢? a.在浏览器地址栏直接输入一个请求地址 b.点击超链接 c.表单默认的提交方式method="GET/get" B:get请求方式的特点 a.会将请求参数 ...

  6. ios 用LLDB查看模拟器文件路径以及一些常用的命令

    我看网络上有好多有关lldb调试命令的介绍,我都看了一遍,都没有这个方法,所以我在这里补充出来,帮助需要的人. 另外附上一些 实用LLDB命令 我们可以使用e命令定义变量 (lldb) e NSStr ...

  7. cocos2dx入门分析 hello world

    打开新建的"findmistress"项目,可以看到项目文件是由多个代码文件及文件夹组成的,其中 Hello World 的代码文件直接存放于该项目文件夹中.下面我们来详细介绍一下 ...

  8. struts2 package元素

    <package../>元素         name         必选    包名         extends     可选    继承         namespace    ...

  9. UEditor配置图片上传

    最近项目中需要用到一个图文编辑器功能,因为之前的kingeditor功能过于简陋,所以决定换成Ueditor,前端已经配置好了,这个是后台配置 1,确定前台已经配置好了 2,将编辑器的插件包下载下来, ...

  10. Java 高效检查一个数组中是否包含某个值

    如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...