删除链表倒数第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));
}
};