1.实现可以动态扩容的数组:
思路:新建数组的时候,将数组的容量大小设置为一个变量,如果数组容量不够的时候,可以将原来数据扩大原来的几倍,进行扩容;也可以直接使用c++中的vector容器,不必考虑原数组的大小,如果需要增加元素,直接v.pushback();即可;
2.将两个有序数组合并成一个有序数组:
思路:类似归并排序的套路,先根据两个数组的大小新建一个新的数组,然后利用归并排序的想法将两个数组中的数据有序的插入新的数组中;
3.实现一个大小固定的有序数组,支持动态增删改操作:
思路:新建一个有序的大小固定的数组,删除一个数据时,可以使用二分查找,找到对应的位置,删除之后,将后边的数据按顺序前移一个位置;增加一个元素的时候,比较增加的元素是否比原数组中的边界值大或者小,如果增加的数据在区间范围内,则删除对应方向的边界值(方向按照要求选取),找到对应的位置之后,先将目标位置后边数据后移一个位置,留出空位,然后插入对应的数据;
leetcode 链表是否有环(踩得坑,注意空指针的处理,就是在判断条件中避免空指针,使用快慢指针的思想)
/**
-
Definition for singly-linked list.
-
struct ListNode {
-
int val;
-
ListNode *next;
-
ListNode(int x) : val(x), next(NULL) {}
-
};
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL)
return false;ListNode* p1 = head; ListNode* p2 = head; while (p2 != NULL && p1 != NULL && p2->next != NULL){//注意处理空指针的情况; if (p1->next == NULL) return false; if (p1->next->next == p2->next) return true; p1=p1->next->next; p2=p2->next; } return false;
}
};
求众数:
方法一:遍历,使用map记录每个数字出现的次数,最后判断;
方法二:如果存在众数,则出现的次数比其他数字出现的数字之和还要多,设置函数校验输入是否合法;从数组的第一个数字开始,记录次数为1,向后遍历,如果遇到相同的就+1,不同的减1,若最后值为正数,则为众数,否则退出,从第二个数字开始继续进行;