今天是第一次在优快云上发博客,有点小紧张,有点小激动,因为我之前以为只有大牛才能写这个东西哈哈哈哈……
首先感谢CCTV,ZJTV给予我看不见的支持,但我知道你们一直都在!!然后感谢我的父母,因为有了他们,才有了这么傻了吧唧的我!最后,感谢我亲爱的男胖友,有了他,我的生活才多姿多彩,常常想要通过打人来强身健体!(开玩笑啦,他一直是我的榜样、偶像 and 我的鸭子!!)
LeetCode第一题,Roma trans to Int emmmmm还是用的if语句,反正也不难……
class Solution {
public:
int romanToInt(string s)
{
int l=s.size();
int ans=0;
for(int i=0;i<l;i++)
{
if (s[i]=='M')
ans+=1000;
if(s[i]=='D')
ans+=500;
if(s[i]=='C')
{
if(s[i+1]=='M'||s[i+1]=='D')
ans-=100;
else
ans+=100;
}
if(s[i]=='L')
ans+=50;
if(s[i]=='X')
{
if(s[i+1]=='C'||s[i+1]=='L')
ans-=10;
else ans+=10;
}
if(s[i]=='V')
ans+=5;
if(s[i]=='I')
{
if(s[i+1]=='X'||s[i+1]=='V')
ans-=1;
else ans+=1;
}
}
return ans;
}
};
没什么好解释的……哈哈哈哈 按照惯例,学习一个优秀的代码!
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
ans=0
for i in range(len(s)):
if i<len(s)-1 and a[s[i]]<a[s[i+1]]:
ans-=a[s[i]]
else:
ans+=a[s[i]]
return ans
emmmmmm我开始想用Python 用 if XXX in s:巴拉巴拉,好像也是枚举法,就算了……又想用C++中的建立两个列表(可能比较适用于上一道题),好像都有点卡壳……看了优秀答案!才知道!!自己好笨哦!!情况被简单的分为了两种,加或者减!!我的算法也是加减并用,但是条件是写了右边一位是否为“XXX”,然后根据情况加加减减……所以,分情况是非常非常重要的,优秀的工程师大概在分类找规律方面很擅长吧(比如鸭子!!!)
第二道题更加蛋疼,首先那个vector<string>& strs我就搞不懂,还是得靠老宋给我讲,我才明白!然后捯饬了2h,还是要靠老宋来debug……我真是个菜鸡……
这道题是很简单的那个“最长前缀字符串”,听起来是不是超级简单!!也应该是很简单的,但我还是做了好久……
class Solution {
public:
string longestCommonPrefix(vector<string>& strs)
{if (strs.empty())
return "";
string ans;int l=strs[0].size();int flag=0;
for(int i=0;i<strs.size();i++)
{
l=min(l,(int)strs[i].size());
}
for(int j=0;j<l;j++)
{int i=0;
for(int i=0;i<strs.size();i++)
{
char a=strs[0][j];
if(strs[i][j]==a)
{flag+=1;
if(flag==strs.size())
{ ans+=a;
flag=0;
}
}
else {flag=0;
if(ans.size()==0)
return "";
else{ flag=0; break;}}
}
}
return ans;
}
};
第一个知识点就是vector<string>&strs的含义,这个类似于二维数组,strs[0]表示第一行,strs[0][0]表示第一行第一个元素,就像是["flower","flow","flappy"],一个字符串占一行这样……了解之后神清气爽!
第二个知识点就是输入为空时,strs[0]的出现会导致越界问题,所以要在这个之前判断是否为空!
然后思路也就是小白的思路,现在看一下!宋神的答案吧!!
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
{
return "";
}
for(int i=0;i<strs[0].size();i++)
{
char c=strs[0][i];
for(int j=1;j<strs.size();j++)
{
if(i==strs[j].size()||strs[j][i]!=c)
return strs[0].substr(0,i);
}
}
return strs[0];
}
看见了宋神开篇那句“题目较简单不作分析”的我仿佛万箭穿心……
为森么!第一篇优快云要这么忧桑!!!
这个答案真的很优秀了!思路是跟据第一个字符串进行比较,省去了查找最小长度的步骤,碰到字符串末尾或者不再重复的字符时返回第一个字符串并进行相应删减!
我只能说,这个代码我估计近几个月来是写不出来的……忧桑……
————————————————————————————————————————————————————————
华丽丽的分割线
————————————————————————————————————————————————————————
今天提到了函数模板的问题,就顺便看一看这个概念。
函数模板:
函数模板通过template与typename两个关键字来定义,如下
就好比swap<int>(a,b)和swap<float>(a,b)适用于不同类型的数据,省去了重复编译的过程。
博主总结的好:https://blog.youkuaiyun.com/lms1008611/article/details/81985815
借用一下总结:
- 函数模板是泛型编程在C++中的应用方式之一
- 函数模板能够根据实参对参数类型进行推导
- 函数模板支持显示的指定参数类型
- 函数模板是C++中重要的代码复用方式
- 函数模板通过具体类型产生不同的函数
- 函数模板可以定义任意多个不同的类型参数
- 函数模板中的返回值类型必须显示指定
- 函数模板可以像普通函数一样重载
然后解决一下昨天的遗留问题:二维最大熵阈值分割方法
找了一篇比较靠谱的文章:http://blog.sina.com.cn/s/blog_159aff7940102xbm4.html
首先,熵是一种统计测量方法,用以确定随机数据源中所包含的信息数量。熵在图像处理中可以理解为图像信息的多少。例如,包含有N个像素的图像I,可以解释为包含有N个符号的信息,每一个符号的值都独立于获取与=于有限范围K(0~255)中的不同灰度值。
算法思路:给定阈值q,将图像划分为前景p0和背景p1,计算每一灰度出现的概率,po计算的是0~q,p1计算的是q~255。然后计算相应的熵值:
图像的总熵就是二者之和,能使得总熵最大的q即为最佳阈值。
今儿到这,明儿继续!