【2020.5.13今日编程】LeetCode 82. 删除排序链表中的重复元素 II + LeetCode 面试题60. n个骰子的点数 +LeetCode 面试题67. 把字符串转换成整数

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刷个两三遍也不为过!!!当然,大佬除外,厉害的人真的很多了~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值