面试题

算法数据结构

1、输入两个递增排序的链表,合并这两个链表并使新链表中的节点依然是递增顺序的。

ListNode* MergeList(ListNode* ListHeadNodeOne, ListNode* ListHeadNodeTwo){
     if (NULL == ListHeadNodeOne)
     {
         return ListHeadNodeTwo;
     }
     else if (NULL == ListHeadNodeTwo)
     {
         return ListHeadNodeOne;
     }
     
     ListNode* ListResultNode = NULL;
     if (ListHeadNodeOne->NodeValue < ListHeadNodeTwo->NodeValue)
     {
         ListResultNode = ListHeadNodeOne;
         ListResultNode->NextNode = MergeList(ListHeadNodeOne->NextNode, ListHeadNodeTwo);
     }
     else
     {
         ListResultNode = ListHeadNodeTwo;
         ListResultNode->NextNode = MergeList(ListHeadNodeOne, ListHeadNodeTwo->NextNode);
     }

     return ListResultNode;
}

2、快速排序

private static int partition(int[] arr, int low, int high) {
    //指定左指针i和右指针j
    int i = low;
    int j= high;

    //将第一个数作为基准值。挖坑
    int x = arr[low];

    //使用循环实现分区操作
    while(i<j){//5  8
        //1.从右向左移动j,找到第一个小于基准值的值 arr[j]
        while(arr[j]>=x && i<j){
            j--;
        }
        //2.将右侧找到小于基准数的值加入到左边的(坑)位置, 左指针想中间移动一个位置i++
        if(i<j){
            arr[i] = arr[j];
            i++;
        }
        //3.从左向右移动i,找到第一个大于等于基准值的值 arr[i]
        while(arr[i]<x && i<j){
            i++;
        }
        //4.将左侧找到的打印等于基准值的值加入到右边的坑中,右指针向中间移动一个位置 j--
        if(i<j){
            arr[j] = arr[i];
            j--;
        }
    }

    //使用基准值填坑,这就是基准值的最终位置
    arr[i] = x;//arr[j] = y;
    //返回基准值的位置索引
    return i; //return j;
}

private static void quickSort(int[] arr, int low, int high) {//???递归何时结束
    if(low < high){
        //分区操作,将一个数组分成两个分区,返回分区界限索引
        int index = partition(arr,low,high);
        //对左分区进行快排
        quickSort(arr,low,index-1);
        //对右分区进行快排
        quickSort(arr,index+1,high);
    }

}

3、2叉树的下一节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
    }
};

TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
    if(pNode==NULL)return NULL;
    if(pNode->right)//如果有右子树,那么沿右子树往下最左边的节点即为下一个节点
    {
        TreeLinkNode *p=pNode->right;
        while(p->left)p=p->left;
        return p;
    }else{//如果没有右子树,看父节点
        TreeLinkNode *father=pNode->next;
        if(father==NULL)return NULL;//如果没有父节点,返回NULL
        else{
            if(father->left==pNode)return father;//如果该节点为父节点的左孩子,则中序遍历下一个节点即为父节点
            else{
                TreeLinkNode *grandFather=father->next;
                while(grandFather)//如果该节点为父节点的右孩子,则往上不断查找曾祖父节点,直到有一个节点是其父节点的左孩子
                {
                    if(grandFather->left==father)return grandFather;
                    father=grandFather;
                    grandFather=father->next;
                }
                return NULL;//如果找不到,返回NULL
            }
        }
    }
}

4、请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配]

bool match(char* str, char* pattern)
{
    if (str == NULL || pattern == NULL)
        return false;
    return matchCore(str,pattern);
}
bool matchCore(char* str, char* pattern)
{
    if (*str == '\0'&&*pattern == '\0') return true; //迭代终止条件
    if (*str != '\0'&&*pattern == '\0') return false;//迭代终止条件
    if (*(pattern + 1) == '*')
    {
        if (*str == *pattern||(*pattern=='.'&&*str!='\0'))
            return matchCore(str + 1, pattern) || matchCore(str, pattern + 2);
        else
            return matchCore(str, pattern + 2);
    }
    if (*str == *pattern || (*pattern=='.'&&*str!='\0'))
        return matchCore(str+1,pattern+1);
    
    return false;
}

Android 基础

5、多线程并发
sleep 和 wait 区别
(1)这两个方法来自不同的类,sleep是来自Thread,wait是来自Object;
(2)sleep方法没有释放锁,而wait方法释放了锁。
(3)wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

6、ArrayList和LinkedList的区别,以及应用场景
ArrayList是基于数组实现的,ArrayList线程不安全。
LinkedList是基于双链表实现的:
使用场景:
(1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;
( 2 ) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

7、Http https区别,https的加密原理,非对称加密
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
https实现原理:
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
8、自定义View流程,onMeasure 中的 MeasureSpec 是如何计算的?
onMeasure->onLayout->onDraw

1.UNSPECIFIED :父试图不对子试图有任何的约束,它可以达到这几所需要的尺寸大小,例如:ListView,ScrollView等,一般在我们在自定义控件中不会用到这个测量模式的。

2.EXACTLY:父视图指定了确切的大小,无论子视图指定多大的尺寸,子视图必须在父视图指定的大小范围内,对应的属性为match_parent或者具体的值,父控件可以通过MeasureSpec.getSize(measureSpec)直接得到子控件的尺寸。

3.AT_MOST:父控件为子控件指定一个最大尺寸,子视图必须确保自己的孩子视图可以适应在该尺寸范围内,对应的属性为wrap_content,这种模式下父控件无法测量子view的大小,只能由子控件自己根据需求去计算自己的尺寸,这种模式就是我们自定义视图需要实现测量逻辑的情况。这就是大部分要重写onMeasure处理的过程,在wrap_content模式下,自定义view要显示多大,还是说显示父容器显示的大小,这个由你控制)

总结: OnMeasure(int widthMeasureSpec, int heightMeasureSpec)该方法就是我们自定义控件中测量逻辑的方法,该方法中的参数是父view传递给子view测量width与height大小的要求。在我们自定义视图中,要做的就是根据widthMeasureSpec与heightMeasureSpec进行对view宽高的一个测量,不同的测量模式,测量的逻辑是不同的。

9、三方开源库,原理分析,retrofit, leakCanacy,EventBus等。
10、Jetpack使用过哪些组件?具体用过哪些场景。
11、Kotlin掌握情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容