力扣 数据结构

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
 

提示:

0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

执行用时:8 ms, 在所有 C++ 提交中击败了50.89%的用户

内存消耗:8.9 MB, 在所有 C++ 提交中击败了99.46%的用户

C++

思路:

先判断vector容器大小是否为空

然后拿出第一个字符串获取字符串长度

第一重循环取当前字符串与循环拿出来的字符串进行长度对比,取短的字符串,一点后面字符对比节省时间

第二重循环字符串内的字符进行对比,如果出现不相等就将之前先等的保存下来

两重循环过后再次对比保存的字符串与第一重循环最后一次字符串长度对比获取的最短字符串进行长度大小对比,取小者

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size() == 0) return "";//如果是空,直接返回
        string dest = strs[0];
        int curMinSize = dest.size();
        for(size_t i = 1; i < strs.size(); i++)
        {
            curMinSize = strs[i].size() > curMinSize ? curMinSize : strs[i].size();//获取最短字符串,以便后面比较的时候节省时间            

            for(size_t j = 0; j < curMinSize; j++)
            {
                if(strs[i][j] != dest[j])
                {
                    dest = dest.substr(0,j);
                }
            }
        }
        if(curMinSize < dest.size())//假如后面一个比相同的字符串还短的字符串
            dest = dest.substr(0, curMinSize);

        return dest;
    }
};

 size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数

合并两个有序链表

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]
 

提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

执行用时:8 ms, 在所有 C++ 提交中击败了95.26%的用户

内存消耗:14.3 MB, 在所有 C++ 提交中击败了99.93%的用户

c++

思路:

定义一个新的链表用来存合并的链表。。。。

进入while循环,循环的判断条件是两条链表都不能为空

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode dummy;
        ListNode *l3 = &dummy;//用于存放合并链
        while(l1 && l2)//链表不能为空
        {
            if(l1->val < l2->val)//挨个判断大小
            {
                l3->next = l1;//赋值
                l1 = l1->next;//指向下一个
            }
            else{
                l3->next = l2;
                l2 = l2->next;
            }
            l3 = l3->next;//指向下一个
        }
        l3->next = l1 ? l1 : l2;//补充尾值
        return dummy.next;
    }
};

删除排序数组中重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。
示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。
 

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

c++

思路:先判断vector的大小,0个或1个说明没有重复

然后从第二个开始进行循环判断是否与第一个相等,

如果不相等就保存下来,进1

相等不做任何操作,继续循环

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size() < 2) return nums.size();//如果只有1个或0个,可以直接返回
        int j = 0;    //存长度
        for(int i = 1; i < nums.size(); i++)
        {
            if(nums[j] != nums[i])
                nums[++j] = nums[i];
        }
        return ++j;
    }
};

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。
示例 2:

给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不需要考虑数组中超出新长度后面的元素。
 

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

c++

思路:
循环判断vector里是否有与val不同的,不同则保存,返回下标

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int j = 0;
        for(int i = 0 ; i <nums.size(); i++)
        {
            if(nums[i] != val)
                nums[j++] = nums[i];
        }
        return j;
    }
};


版权声明:本文为qq_45456669原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。