Android面试题——算法篇

本文整理了Android面试中常见的算法题目,包括阶乘、二分查找及其优化、二叉查找树的应用,以及各种排序算法的原理和优缺点。还提供了用两个栈实现队列的思路,强调了递归和迭代的差异。文章旨在帮助开发者更好地准备面试,提升技术能力。
摘要由CSDN通过智能技术生成

前言

一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度?

如果没有的话, 你就需要掌握更加成熟的技术,也需要更多的知识储备,对于我们上班族而言,工作的好坏就变得格外重要,想要拿高的工资,就好好的做好面试准备,

以下是我为大家精心挑选的面试题,话不多说,看东西。

正文

实现阶乘

//采用递归法

    if (number <= 1)
        return 1;
    else
        return number * factorial(number - 1);
}
//采用循环连乘法    
public static int fact(int num){
    int temp=1;
    int factorial=1;
    while(num>=temp){
    factorial=factorial*temp;
    temp++;
    }
    return factorial;
}

二分查找

//递归法

    if (low > high) return -1;
    int mid = low + (high - low) / 2;
    if (array[mid] > target)
        return binarysearch(array, low, mid - 1, target);
    if (array[mid] < target)
        return binarysearch(array, mid + 1, high, target);
    return mid;
}

//循环法

     int low = 0;
    int high = a.length - 1;
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (a[mid] > key)
            high = mid - 1;
        else if (a[mid] < key)
            low = mid + 1;
        else
                return mid;
    }
     return -1;
}

二分查找中值的计算

  • 这是一个经典的话题,如何计算二分查找中的中值?大家一般给出了两种计算方法:
  • 算法一:mid = (low + high) / 2
  • 算法二:mid = low + (high – low)/2
  • 乍看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。但是实际上,区别是存在的。算法一的做法,在极端情况下,(low+high)存在着溢出的风险,进而得到错误的mid结果,导致程序错误。而算法二能够保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。

二分查找法的缺陷

  • 二分查找法的O(logn)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。
  • 数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。
    解决这些缺陷问题更好的方法应该是使用二叉查找树了,最好自然是自平衡二叉查找树了,既能高效的(O(n log n))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。

用两个栈实现队列

题目描述:

  • 用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。
  • 思路:
    压入元素直接压入stack1 删除元素先查看stack2是否为空,非空则弹出;空则将stack1中元素取出,置于stack2中
    代码:
    
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node){
        stack1.push(node);
    }
    
    public int pop(){
        if(stack2.empty()){
            while(!stack1.empty())
                stack2.push(stack1.pop());
        }
        return stack2.pop();
}

递归和迭代的区别是什么,各有什么优缺点?

  • 程序调用自身称为递归,利用变量的原值推出新值称为迭代。
    递归的优点大问题转化为小问题,可以减少代码量,同时代码精简,可读性好;

  • 缺点就是递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。
    迭代的好处就是代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销;

  • 缺点就是代码不如递归简洁

  • 判断101-200之间有多少个素数,并输出所有素数
    素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。

  • 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。

  • 思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。

  • 原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 ,另一个大于或等于 。例如 16 能被 2、4、8 整除,16=28,2 小于 4,8 大于 4&#x

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值