简单算法考题记录

  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;
    }

 

posted @ 2019-08-28 16:29  我是好人007  阅读(247)  评论(0编辑  收藏  举报