面试总结——&a+1

找工作是每一位程序员必经的经历,在这里向大家推荐两本面试准备的两本书籍,一本是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;
	}
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值