LeetCode 82. 删除排序链表中的重复元素 II
中等
- 题目:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
- 方法:把重复的节点直接跳过即可(不过要注意的是,重复的节点有可能是首元节点,所以需要构造一个dummy节点)。
- 示例:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
- cpp代码实现:
class Solution
{
public:
ListNode* deleteDuplicates(ListNode* head)
{
if(head == NULL)
return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* ptr = head;
ListNode* pre = dummy;
while(ptr != NULL && ptr->next != NULL)
{
if(ptr->val == ptr->next->val)
{
while(ptr->next && ptr->val == ptr->next->val)
ptr->next = ptr->next->next;
pre->next = ptr->next;
ptr = ptr->next;
}
else
{
pre = ptr;
ptr = ptr->next;
}
}
return dummy->next;
}
};
LeetCode 面试题60. n个骰子的点数
简单
-
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 -
示例:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
- 方法:动态规划(动态规划真的每天都能碰到一道题~~~~~~~~~~~~~)。
- cpp代码实现:
class Solution
{
public:
vector<double> twoSum(int n)
{
vector<double>ans(5 * n + 1);
vextor<vector<int>>dp(n + 1, vector<int>(6 * n + 1));
double all = pow(6, n);
for(int i = 1; i <= 6; ++i)
dp[1][i] = 1;
for(int i = 2; i <= n; ++i)
for(int j = i; j <= 6 * n; ++j)
for(int k = 1; k <= min(j, 6); ++k)
dp[i][j] += dp[i - 1][j - k];
int index = 0;
for(int i = n; i <= 6 * n; ++i)
{
ans[index++] = dp[n][i] / all;
}
return ans;
}
};
LeetCode 面试题67. 把字符串转换成整数
中等
-
题目:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
(1)首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
(2)当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
(3)该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。 -
示例:
输入: “42”
输出: 42
- 方法:这个题真的就是按照题目的要求一步一步来完成,不过细节一定要注意,不然调试不过去的。
- cpp代码实现:
class Solution
{
public:
int strToInt(string str)
{
if(str.empty())
return 0;
long res = 0;
int left = 0;
bool flag = false;
while(left < str.size() && str[left] == ' ')
++left;
if(str[left] == '-')
flag = true;
if(str[left] == '-' || str[left] == '+')
++left;
while(str[left] >= '0' && str[left] <= '9' && left < str.size())
{
res = res * 10 + str[left] - '0';
if(flag == false && res > INT_MAX)
return INT_MAX;
else if(flag == true && -res < INT_MIN)
return INT_MIN;
++left;
}
return res;
}
};
【写在最后】
今天辗转看了挺多面经的,手撕代码其实范围特别的广,就是感觉你永远都准备不完的那种,不过如果时间真的不够的话,剑指offer真的必刷,而且对于像我这种第一次做过的题第二次还是不会做的人来说,剑指offer刷个两三遍也不为过!!!当然,大佬除外,厉害的人真的很多了~~~