力扣-数据结构3

删除链表倒数第n个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:

输入:head = [1], n = 1
输出:[]
示例 3:

输入:head = [1,2], n = 1
输出:[1]
 

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

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

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

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

c++

思路:

设全局变量 cur = 0;

先判断链表是否为空

进入递归,这个递归相当于每一个链表里的值都被判断一遍,且每进入一次递归cur加一,并判断cur值是否等于n,是则返回这个值的下一个值,否则返回该值。

/**
 * 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:
int cur = 0;
    ListNode* removeNthFromEnd(ListNode* head, int n) {
              if(!head) return NULL;
              head->next = removeNthFromEnd(head->next, n);
              cur++;
              if(n == cur) return head->next;
              return head;


    }
};

左叶子之和

计算给定二叉树的所有左叶子之和。

示例:

    3
   / \
  9  20
    /  \
   15   7

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
 

通过次数67,613提交次数119,673

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

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

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

c++

思路:

先判断节点是否空

再判断节点的左子树是否为空,为空则递归节点的右子树

再判断节点的左子树的左子树且节点的左子树的右子树是否为空,如果是,那么返回节点的左子树的值加节点的右子树进行递归所返回的值;

否则返回节点的左子树递归所返回的值加节点的右子树递归所返回的值

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if( !root ) return 0;
        if( !root->left ) return sumOfLeftLeaves(root->right);
        if( !root->left->left && !root->left->right ) return root->left->val + sumOfLeftLeaves(root->right);
        return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
    }
};

字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2
 

提示:你可以假定该字符串只包含小写字母。

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

c++

思路:计数法

创建数组,进行依次计数

class Solution {
public:
    int firstUniqChar(string s) {
       int cnt[26];
       memset(cnt, 0, sizeof(cnt));
       for(char c : s) cnt[c - 'a']++;
       for(int i = 0; i < s.length(); i++){
            if(cnt[s[i] - 'a'] == 1) return i;
        }
    
        return -1;
    }
};

外观数列

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = "1"
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1 
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 "3322251" 的描述如下图:

示例 1:

输入:n = 1
输出:"1"
解释:这是一个基本样例。
示例 2:

输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = 读 "1" = 一 个 1 = "11"
countAndSay(3) = 读 "11" = 二 个 1 = "21"
countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"

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

思路:使用递归

假如  n=3

则执行 "else return count(countAndSay(n-1));"

那么递归回来返回”11“到count(string s)函数里去

class Solution { 
public: 
    string count(string s){ 
        string s1=""; 
        int length=s.size(); 
        int i=0; 
        for(int j=1;j<length;j++) { 
            if(s[i]!=s[j]) 
            { 
                s1 += (char)((j-i) + '0'); 
                s1+=s[i]; 
                i=j; 
            } 
        } 
        s1 += (char)((length-i) + '0');
        s1+=s[i]; return s1; 
    } 
    string countAndSay(int n) { 
        if(n==1) return "1"; 
        if(n==2) return "11"; 
        else return count(countAndSay(n-1)); 
    } 
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
力扣(LeetCode)中,数据结构的调用细则如下: 1. 导入库:首先,你需要导入相应的库来使用数据结构。例如,在使用数组时,你可以导入`<vector>`头文件,而在使用链表时,可以导入`<list>`头文件。 2. 创建数据结构对象:接下来,你需要创建数据结构的对象。具体的创建方式取决于不同的数据结构。例如,在创建一个数组对象时,你可以使用`vector<int> arr`来声明一个整型数组对象。 3. 插入元素:一旦创建了数据结构对象,你可以使用相应的方法向其中插入元素。不同的数据结构有不同的插入方法。例如,在向数组中插入元素时,你可以使用`arr.push_back(element)`将元素添加到数组的末尾。 4. 访问元素:要访问数据结构中的元素,你可以使用相应的索引或迭代器。例如,对于数组,你可以使用`arr[index]`来访问特定位置的元素。 5. 修改元素:如果需要修改数据结构中的元素,你可以直接对元素进行赋值操作。例如,对于数组,你可以使用`arr[index] = newValue`来修改特定位置的元素。 6. 删除元素:如果需要删除数据结构中的元素,你可以使用相应的方法进行删除。例如,在删除数组中的元素时,你可以使用`arr.erase(iterator)`将迭代器指向的元素从数组中删除。 需要注意的是,不同的数据结构具有不同的特性和操作方法。在使用数据结构时,你需要了解其特点,并根据具体情况选择合适的方法进行操作。此外,力扣上还提供了许多常见数据结构的问题和练习题,供你练习和深入理解数据结构的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值