找工作是每一位程序员必经的经历,在这里向大家推荐两本面试准备的两本书籍,一本是C语言由林锐编写《高质量c/c++编程》,另一本是Java语言由李刚编写的《疯狂Java:突破程序员基本功的16课》。
1.对C语言指针的理解
下面程序的输出结果是多少?
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d,%d\n",*(a+1),*(ptr-1));
printf("a的地址是%x,&a的地址是%x\n",a,&a);
return 0;
答案:输出:2,5
*(a+1)是a[1], *(ptr -1)就是a[4],执行结果是2, 5
&a+1不是首地址+1,系统会认为加一个a数组的偏移, 是偏移了一个数组的大小(本例是5个int )
int *ptr = (int *)(&a+1);
则ptr实际上是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为int(*)[5];
而指针加1要根据指针类型加上一定的值, 不同类型的指针+1之后增加的大小不同(增加的是指针类型的长度)。
a是长度为5的int数组指针,所以要加5*sizeof(int)
因此,ptr实际是ptr[5],
但是ptr与(&a+1)类型是不一样的(这点很重要,ptr是int*类型而(&a+1)是int(*)[5]类型)
所以ptr-1只会减去sizeof(int *)。
特别注意:a, &a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,而&a是对象(数组)首地址;a+1是数组下一元素的地址,即a[1], &a+1是下一个对象的地址,即a[5].
2.从两个无序数组中选择共同的元素
/**
* @author Guo_guo
* @Description 找出两个数组中相同的元素;
*/
public class SameElementInTwoArrays {
public static void main(String[] args) {
int[] arrayA = new int[] { 3, 5, 1, 9, 10, 38, 22, 100, 44 };
int[] arrayB = new int[] { 26, 33, 3, 10, 22, 44, 2000, 5 };
// Set result = getSameElementByHashSet(arrayA, arrayB);
Set result = getSameElementByBitSet(arrayA, arrayB);
Iterator<Integer> setIter = result.iterator();
while (setIter.hasNext()) {
System.out.println(setIter.next());
}
}
/**
* @Description 利用hashset(哈希表数据结构)快速找出两个数组的共同元素
* @param argA
* @param argB
* @return
* @return Set
* @authoy Guo_guo
* @date 2017-2-26
*/
private static Set getSameElementByHashSet(int[] argA, int[] argB) {
Set argASet = new HashSet();
Set<Integer> tempSet = new HashSet<Integer>();
for (int i = 0; i < argA.length; i++) {
argASet.add(Integer.valueOf(argA[i]));
}
// 把数组b中的元素添加到temp中
// 如果temp中已存在相同的元素,则temp.add(b[j])返回false
for (int i = 0; i < argB.length; i++) {
if (!argASet.add(Integer.valueOf(argB[i]))) {
tempSet.add(Integer.valueOf(argB[i]));
}
}
return tempSet;
}
/**
* @Description 利用bitset(哈希表数据结构)快速找出两个数组的共同元素
* @param argA
* @param argB
* @return
* @return Set
* @authoy Guo_guo
* @date 2017-2-26
*/
private static Set getSameElementByBitSet(int[] argA, int[] argB) {
BitSet bitSetA = new BitSet();
Set<Integer> tempSet = new HashSet<Integer>();
for (int i = 0; i < argA.length; i++) {
bitSetA.set(argA[i]);
}
// 遍历数组b,如果在bitSetA中已存在则返回true,将其添加到temp中
for (int i = 0; i < argB.length; i++) {
if (bitSetA.get(argB[i])) {
tempSet.add(Integer.valueOf(argB[i]));
}
}
return tempSet;
}
}