蔚来汽车(7.3)

  1. 第一题给出一个点坐标和三角形的三个顶点坐标,求点到三角形的最短距离,若点在三角形内则返回0,在三角形外则输出最短距离。

    public static float cacluate(float[] point,float[][] triangle){
        float distances = 0;
        float area = triAngleAreas(triangle[0],triangle[1],triangle[2]);
        float a = triAngleAreas(triangle[0],triangle[1],point);
        float b = triAngleAreas(triangle[0],triangle[2],point);
        float c = triAngleAreas(triangle[1],triangle[2],point);
        if(area == a+b+c){
            return 0.0f;
        }else{
            float distances1 = triAngleDistances(triangle[0], triangle[1], point);
            float distances2 = triAngleDistances(triangle[0], triangle[2], point);
            float distances3 = triAngleDistances(triangle[1], triangle[2], point);
            distances = Math.min(distances1, Math.min(distances2, distances3));
        }
        return distances;
    
    }
    
    private static float triAngleDistances(float[] a, float[] b, float[] point) {
        float x1 = a[0];
        float y1 = a[1];
        float x2 = b[0];
        float y2 = b[1];
        float k = (y2-y1)/(x2-x1);
        float bb = y1-k*x1;
        float x0 = point[0];
        float y0 = point[1];
        return (float) ((k*x0 - y0 +bb)/(Math.sqrt(k*k + 1)));
    
    }
    private static float triAngleAreas(float[] a, float[] b, float[] c) {
        float x1 = a[0];
        float y1 = a[1];
        float x2 = b[0];
        float y2 = b[1];
        float x3 = c[0];
        float y3 = c[1];
        return Math.abs(x1*y2-x1*y3+x2*y3-x2*y1+x3*y1-x2*y2);
    }
  2. 比较版本号

    public int compareVersion(String version1, String version2) {
         String[] nums1 = version1.split("\\.");
         String[] nums2 = version2.split("\\.");
    
         int m = nums1.length;
         int n = nums2.length;
         for(int i = 0;i<Math.max(m,n);i++){
             int a = i<m ? Integer.valueOf(nums1[i]):0;
             int b = i<n ? Integer.valueOf(nums2[i]):0;
             if(a<b){
                 return -1;
             }else if(a>b){
                 return 1;
             }
         }
         return 0;
    }
  3. 搜索二维矩阵
    1.第一次二分:从第 0 列中的「所有行」开始找,找到合适的行 row
    2.第二次二分:从 row 中「所有列」开始找,找到合适的列 col

    public boolean Find(int target, int [][] array) {
       int[] row_num = new int[array.length];
       for(int i = 0;i<array.length;i++){
           row_num[i] = array[i][0];
       }
       int row = left_bound(row_num, target);
       if(row <0){
            return false;
        }
       int[] col_num = array[row];
       return bound(col_num,target);
    }
    public int left_bound(int[] nums,int target){
        int left = 0;
        int right = nums.length-1;
        while(left <= right){
            int mid = (left + right)/2;
            if(nums[mid] <= target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
    
        return left - 1;
    }
    public boolean bound(int[] nums,int target){
        int left = 0;
        int right = nums.length-1;
        while(left <= right){
            int mid = (left+right)/2;
            if(nums[mid] < target){
                left = mid +1;
            }else if(nums[mid] >target){
                right = mid - 1;
            }else if(nums[mid] == target){
                return true;
            }
        }
        return false;
    }

4.接雨水

 public static long maxWater (int[] arr) {
        // write code here
        if(arr.length == 0){
            return 0;
        }
        int n = arr.length;
        long result = 0;
        long[] left_maxs = new long[n];
        left_maxs[0] = arr[0];
        long[] right_maxs = new long[n];
        for(int i = 1;i<n;i++){
            left_maxs[i] = Math.max(left_maxs[i-1],arr[i]);
        }
        right_maxs[n-1] = arr[n-1];
        for(int j = n-2;j>=0;j--){
            right_maxs[j] = Math.max(arr[j],right_maxs[j+1]);
        }
        for(int i = 1;i<n;i++){
            result += Math.min(right_maxs[i],left_maxs[i]) - arr[i];
        }
        return result;
    }

5.复原 IP 地址

class Solution {
    List<String> res;
    public List<String> restoreIpAddresses(String s) {
        res = new ArrayList<>();
        List<String> temp = new ArrayList<>();
        dfs(s,temp,0);
        return res;
    }

    public void dfs(String s,List<String> temp,int index){
        if(temp.size() >4){
            return;
        }
        if(temp.size() >= 4 && index != s.length()){
            return;
        }
        if(temp.size() == 4){
            String temps = new String(temp.get(0) + "." + temp.get(1) + "." + temp.get(2) + "." + temp.get(3));
            res.add(temps);
            return;
        }
        for(int i = index;i<s.length();i++){
            String sub = s.substring(index,i+1);
            //防止01 
            if((sub.length() >= 2 && sub.startsWith("0")) || sub.length() >3){
                continue;
            }
            int te = Integer.parseInt(sub);
            if(te <0 || te >=256){
                continue;
            }
            temp.add(sub);
            dfs(s,temp,i+1);
            temp.remove(temp.size()-1);
        }
    }
}
全部评论
牛啊牛啊
1 回复 分享
发布于 2021-07-05 11:52
点赞 回复 分享
发布于 2021-07-07 21:48

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
5
12
分享

创作者周榜

更多
牛客网
牛客企业服务