算法面试题

Posted Kwqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法面试题相关的知识,希望对你有一定的参考价值。

快手面试题 

题目描述

博主的思路: 先用一个集合list,存储0的下标,然后依次判断,这些0所在的位置能否种花,若能,则将flowerbed对应位置改为1;

具体代码: 

class Solution 
    public boolean canPlaceFlowers(int[] flowerbed, int n) 
        if(n==0)
            return true;
        
        if(flowerbed.length==1&&flowerbed[0]==0&&n==1)
            return true;
        
         if(flowerbed.length==1&&flowerbed[0]==0&&n>1)
            return false;
        
         if(flowerbed.length==1&&flowerbed[0]==1&&n>=1)
            return false;
        
        
        List<Integer> list=new ArrayList<Integer>();
        int count=0;
        for(int i=0;i<flowerbed.length;i++)
            if(flowerbed[i]==0)
                list.add(i);
            
        
         if(list.get(0)==0&&flowerbed[list.get(0)+1]==0)
                flowerbed[0]=1;
                count++;
            
        for(int i=1;i<list.size();i++)
            if(flowerbed[list.get(i)-1]==0&&list.get(i)!=flowerbed.length-1&&flowerbed[list.get(i)+1]==0)
                flowerbed[list.get(i)]=1;
                count++;
            else if(list.get(i)==flowerbed.length-1&&flowerbed[list.get(i)-1]==0)
                flowerbed[list.get(i)]=1;
                count++;
            
        
        return count>=n;     

前面的代码写的不太美观,修正下

class Solution 
    public boolean canPlaceFlowers(int[] flowerbed, int n) 
       /*
       分析题意:判断每个位置能否种花,要看他的前置结点和后置结点是否为0,有的话此节点可以种花
       存在两个特殊的情况,如果是第一个位置的话,则只需要判断后置结点是否为0即可,
       如果是最后一个位置,只需要判断前置结点是否为0即可,但是我们为了保证判断条件的一致性,
       所以第一个花盆,让他的前置结点直接给0.最后一个花盆,后置结点直接给0
       */
        int size=flowerbed.length;
        for (int i=0;i<size;i++)
           if (flowerbed[i]==1)
               continue;
           
        //如果当前位置为0 则判断其前置结点和后置结点是否为0
            int pre=i==0?0:flowerbed[i-1];
           int next=i==(size-1)?0:flowerbed[i+1];
           if (pre==0&&next==0)
               flowerbed[i]=1;
               n--;
           
        
    return n<=0;

628. 三个数的最大乘积

题目描述: 

思路:

通过归纳不难分析出,数组有五种情况

第一种:全正  最大为后三个相乘 

第二种:全负  最大为后三个相乘 

第三种:一个正  最大为前两个和最后一个相乘

第四种:两个正  最大为后三个或者前两个和最后一个相乘

第五种:三个正及以上 最大为后三个相乘或者前两个和最后一个相乘

总结发现,一个数组三个数的最大乘积,要么是数组的后三个乘积之和,要么是前两个和最后一个相乘。

方法一具体代码

class Solution 
    public int maximumProduct(int[] nums) 
        Arrays.sort(nums);
        int n=nums.length;  
 return   Math.max(nums[0]*nums[1]*nums[n-1],nums[n-1]*nums[n-2]*nums[n-3]);
    

方法二

线性扫描

在方法一中,我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。

具体代码

class Solution 
    public int maximumProduct(int[] nums) 
        // 最小的和第二小的
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        // 最大的、第二大的和第三大的
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;

        for (int x : nums) 
            if (x < min1) 
                min2 = min1;
                min1 = x;
             else if (x < min2) 
                min2 = x;
            

            if (x > max1) 
                max3 = max2;
                max2 = max1;
                max1 = x;
             else if (x > max2) 
                max3 = max2;
                max2 = x;
             else if (x > max3) 
                max3 = x;
            
        

        return Math.max(min1 * min2 * max1, max1 * max2 * max3);
    


以上是关于算法面试题的主要内容,如果未能解决你的问题,请参考以下文章

快手面试代码题

Android研发大厂面试记:阿里,字节,快手,滴滴等面试题汇总

一些最基础的面试题

211程序员面试快手,3个面试官都是清华毕业,看到面试题懵了

快手Java社招面试题解析

快手Java社招面试题解析