简单算法考题记录
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; }