zoukankan      html  css  js  c++  java
  • 简单算法考题记录

      1.给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内或在边上

      思路:如果在三角形类,则三角形ABP的面积+ACP+BCP等于ABC的面积

      计算三角形面积

    float GetTriangleSquar(const point_float pt0, const point_float pt1, const point_float pt2)
    {
      point_float AB,BC;
      AB.x = pt1.x - pt0.x;
      AB.y = pt1.y - pt0.y;
      BC.x = pt2.x - pt1.x;
      BC.y = pt2.y - pt1.y;
      return fabs((AB.x * BC.y - AB.y * BC.x)) / 2.0f;//向量的叉乘
    } 
     
      三角形面积计算后比较得到结果。

       2.n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

      

    //n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)
    vector<int> find(vector<int> &num)
    {
        int len = num.size();
        //空数组,返回空
        if(len == 0)
            return {};
        stack<int> notFind;//栈:num中还未找到符合条件的元素索引
        vector<int> res(len, -1);//返回结果:初始化-1,表示未找到
        int i = 0;
        while(i < len)//遍历数组
        {
            //如果栈空或者当前num元素不大于栈顶,将当前元素压栈,索引后移
            if(notFind.empty() || num[notFind.top()] >= num[i])
                notFind.push(i++);
            else//有待处理元素,且num当前元素大于栈顶索引元素,符合条件,更新结果数组中该索引的值,栈顶出栈。
            {
                res[notFind.top()] = num[i];
                notFind.pop();
            }
        }
        return res;
    }

      3.给你一个字符串,找出第一个不重复的字符,如“abbbabcd”,则第一个不重复就是c

    char find1(string s)
    {
        char ch = '#';
        int occ[256];    //哈希表  键值为字符,值为位置。
        for (int i = 0; i < 256; i++)
            occ[i] = -1;
        for (int i = 0; i < s.length(); i++)
        {
            if (occ[s[i]] == -1)    //没出现过时值置为字符串中位置
                occ[s[i]] = i;
            else if (occ[s[i]] >= 0)//出现过的置为-2
                occ[s[i]] = -2;
        }
        int min = 256;
        for (int i = 0; i < 256; i++)//扫描哈希表找到大于等于0的最小位置
        {
            if (occ[i] >= 0 && occ[i] < min)
            {
                ch = (char)i;
                min = occ[i];
            }
        }
        return ch;
    }

      4.翻转链表

      使用三个指针,头插法

    listnode* fanzhuan(listnode *head)
    {
        listnode *res = new listnode(-1);
        listnode *pre = nullptr;
        listnode *now = head;
        while (now)
        {
            pre = now;
            now = now->next;
            pre->next = res->next;
            res->next = pre;
        }
        return res->next;
    }

      5.反转链表2

      反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

      说明:
      1 ≤ m ≤ n ≤ 链表长度。

        ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode *t = new ListNode(-1);//头结点
        ListNode *r=t;//保存头结点
        t->next=head;//链表加头结点
        for (int i = 0; i < m - 1; i++)//到m前一个
            t = t->next;
        ListNode *res = t;
        ListNode *pre = t->next;
        for (int j = m; j < n; j++)
        {
            ListNode *now = pre->next;
            pre->next = now->next;
            now->next = res->next;
            res->next = now;
        }
        return r->next;
        }
  • 相关阅读:
    virtualBox中有线和无线两种情况下centos虚拟机和本地机互ping的方案
    微信小程序支付Java服务端开发源码,及那些你不知道的坑(一)
    SpringCloud微服务项目实战
    SpringCloud微服务项目实战
    SpringCloud微服务项目实战,服务注册与发现(附面试题)
    Spring Cloud微服务项目实战--Eureka服务搭建
    SpringBoot+SpringCloud面试总结都在这里
    SpringBoot 实现系统控制并发登录人数
    Java中大量if...else语句的消除替代方案
    SpringBoot基于数据库的定时任务实现
  • 原文地址:https://www.cnblogs.com/wshr007/p/11424827.html
Copyright © 2011-2022 走看看