网易面经

算法编程:1. 返回一个二叉树的最大值;

2.返回二叉树每一层的最大值;

3.扑克牌随便抽五张查是不是顺子(面完查了一下是剑指offer的题目)

题目描述

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
链接:https://www.nowcoder.com/questionTerminal/762836f4d43d43ca9deb273b3de8e1f4

来源:牛客网

思路:

1)没有大小王的时候即判断数是否连续;

2)有大小王的时候,判断数的间隔是否小于王的数量。小于返回true,大于返回false;

3)有相等的牌则直接返回false。

import java.util.*;

扫描二维码关注公众号,回复: 6137777 查看本文章

public class Solution {

    public boolean isContinuous(int [] numbers) {

        if(numbers == null || numbers.length <= 4)

            return false;

        

        //先排序,否则计算间隔的时候可能会出现负值,比较麻烦

        Arrays.sort(numbers);

        int totalGap = 0;

        //计算大小王的数量

        int countZero = 0;

        for(int i = 0; i < numbers.length; i++){

            if(numbers[i] == 0){

                countZero++;

                continue;

            }

            //计算两数之间的间隔

            if(i < numbers.length - 1){

                int gap = numbers[i + 1] - numbers[i] - 1;

                //如果出现对子,如2 2,则gap为-1,直接返回false

                if(gap < 0)

                    return false;

                totalGap += gap;

            }

        }

        //所有数间隔大于王数量,就返回false

        if(totalGap > countZero){

            return false;

        }

        return true;

    }

}

 

4.给第三题的程序想几个有代表性的测例

 

问道TCP/UDP的区别,应用场景;

 

问了线程与进程的区别,以及各自的通信方式

 

问了linux的文件访问权限

 

写个拷贝构造函数的声明,参数为什么要加const。浅拷贝还是深拷贝

 

写个等于操作符重载的声明

 

什么情况会调用拷贝构造,什么时候调用的赋值

 

c的编译过程,每一步干什么,生成什么文件

 

头文件是否参与编译

 

如何防止头文件重复编译

 

static关键字的作用

 

一个数组中,只有一个数字仅出现一次,其他数字均出现两次,找出这个数字

要求:不借助任何空间

我们知道:a^0 = a,a^a = 0,因此这里可以借助异或运算可以实现。

具体实现如下:

 

public class SingleNum {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int[] nums = new int[]{1,2,4,5,3,3,4,1,2};

        System.out.println(singleNumber(nums));

    }

    public static int singleNumber(int[] nums){

        //不借助额外空间,得到只出现一次的数据

        int num = 0;

        for(int i = 0;i<nums.length;i++){

            num ^= nums[i];

        }

        return num;

    }

}

 

两个有序数组,要求不用其他空间,都只遍历一遍,得到两个数组对应集合的差集。A-B  B-A都要求到,数组中可能包含重复数字,

通过最左边元数比较,并且移动下标的思路即可

 

哈希表原理,重复了怎么办,满了怎么办?

   哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

 

记录的存储位置=f(关键字)

 

这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。

 

哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)

    而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。

猜你喜欢

转载自blog.csdn.net/qq_29762941/article/details/88563243
今日推荐