合并两个有序数组

开始的时候将这道题理解错了,发现几个奇怪的测试案例后才明白这道题什么意思。本来的想法就是把nums2全部放到num1里面,然后删除重复元素、排序一下,就有了下面的代码:

class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=0;i<n;i++)
{
nums1.push_back(nums2[i]);
}
sort(nums1.begin(),nums1.end());
vector<int>::iterator iter = unique(nums1.begin(), nums1.end());
nums1.erase(iter, nums1.end());
}
};

后来发现测试案例是这样给的:[1,2,3,0,0,0] 3 [2,5,6] 3,测试的意思是nums1初始化为【1,2,3,0,0,0】,其中后面三个0是初始化自带的,是要将nums2的元素填充进去。既然这样,呢我们就索性就在原来错误的代码上进行修改吧,无非是只取nums1的前m个元素罢了,更改后的成功代码如下:

class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> nums(m,0);
for(int i=0;i<m;i++)
{
nums[i]=nums1[i];
}
for(int i=0;i<n;i++)
{
nums.push_back(nums2[i]);
}
sort(nums.begin(),nums.end());
nums1=nums;
}
};

但是这道题感觉自己还是走捷径做出来的,并没有实际上理解想考察哪一个知识点,所以看了大神的代码:

class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int end=m+n-1;
m--;n--;
while(m>=0&&n>=0)
{
if(nums2[n]>nums1[m])
{
nums1[end--]=nums2[n--]; }
else
{
nums1[end--]=nums1[m--]; }
}
while(n>=0)
{
nums1[end--]=nums2[n--];
} }
};

更优一种解法是

class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int count=m+n-1;
--m;--n;
while(m>=0 && n>=0) A[count--]=(A[m]>B[n]?A[m--]:B[n--]);
while(n>=0) A[count--]=B[n--];
}
};

第一个错误的版本

第一感觉是二分法,如果最中间的呢个版本出错了,说明错误版本肯定在之前;如果中间版本正确,说明错误版本在之后。所以写成以下代码:

// Forward declaration of isBadVersion API.
bool isBadVersion(int version); class Solution {
public:
int firstBadVersion(int n) {
if(n<=0) return 0;
int first=1,end=n;
while(first<=end){
int mid=(first+end)/2;
if(isBadVersion(mid))
end=mid-1;
else
first=mid+1;
}
return first;
}
};

但是却显示超时,后来发现可能是int mid=(first+end)/2;这一行代码出现了问题,因为first+end可能会出现溢出错误,所以改成了一下代码:

// Forward declaration of isBadVersion API.
bool isBadVersion(int version); class Solution {
public:
int firstBadVersion(int n) {
if(n<=0) return 0;
int first=1,end=n;
while(first<=end){
int mid=first+(end-first)/2;
if(isBadVersion(mid))
end=mid-1;
else
first=mid+1;
}
return first;
}
};

直接就成功了。但是溢出错误却显示超出时间限制,是因为leetcode的代码检测是因为发现溢出没有继续执行导致超出时间限制还是其他原因就不知道了。。。但是通过这道简单的题,一定要了解first+(end-first)/2(end+first)/2在表示上虽然相同,但是计算机计算的时候确实完全不同的!这一点在《C++ Primer》这本书P101的练习3.26上也有验证。

罗马数字转整数

首先了解一下罗马数字是什么;

字母 M D C L X V I
代表数字 1000 500 100 50 10 5 1

还有一些具体的规则请见这篇博客

在这里先列举出来,因为对解题还是有帮助的:

1。相同的数字连写,所表示的数等于这些数字相加得到的数。如 XXX表示 30

2.小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数 如VIII 表示8

3.小的数字(限于I, X,C)在大的数字的左边, 所表示的数等于大数减去小的数: 如IV 表示4

4.在一个数的上面画一条横线,表示这个数增值1000倍

注意,并不是将罗马数字所代表的数字加起来就行了,而是需要遵守一定的规则,尤其是第三条。下面放上代码:

class Solution {
public:
int romanToInt(string s) {
unordered_map<char,int> m{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
int sum=0;
for(int i=0;i<s.size();i++)
{
int val=m[s[i]];
if(i==s.size()-1 || m[s[i+1]]<=m[s[i]]) sum+=val;
else
sum-=val;
}
return sum;
}
};

3的幂

最简单的就是写一个循环进行判断,所以我也这么干了。我的代码

class Solution {
public:
bool isPowerOfThree(int n) {
if(n==0) return false;
while(n%3==0)
{
n=n/3;
}
return n==1;
}
};

但是,题目的进阶要求是不使用循环或者递归,当时就比较懵圈,还能有这种操作?看了看大神的代码:

class Solution {
public:
bool isPowerOfThree(int n) {
return(n>0&&int(log10(n)/log10(3))-log10(n)/log10(3)==0);
}
};

用对数来判断是否是3的倍数,int(log10(n)/log10(3))-log10(n)/log10(3)==0这行代码实在是太机智了,自愧不如自愧不如......

Leetcode初级算法(排序和搜索+数学篇)的更多相关文章

  1. LeetCode初级算法--排序和搜索01:第一个错误的版本

    LeetCode初级算法--排序和搜索01:第一个错误的版本 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.cs ...

  2. LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他

    LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...

  3. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  4. 【LeetCode算法】LeetCode初级算法——字符串

      在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...

  5. LeetCode初级算法--链表02:合并两个有序链表

    LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  6. LeetCode初级算法--数组01:只出现一次的数字

    LeetCode初级算法--数组01:只出现一次的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  7. LeetCode初级算法--数组02:旋转数组

    LeetCode初级算法--数组02:旋转数组 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  8. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  9. LeetCode初级算法--链表01:反转链表

    LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

随机推荐

  1. Agc010_D Decrementing

    今天本人因调了上篇博客的题而脑壳不适,不想颓题,因此有了这篇博客. 但是博客毕竟得讲点什么,想想有没有什么代码短的. 哦,好像有,就Agc010_D Decrementing好了. Alice和Bob ...

  2. 报错之-Cannot set property 'onclick' of null

    当js文件放在head里面时,如果绑定了onclick或者onmouseover事件,就会出现如下图类似的错误,是因为浏览器的加载你写的html文档的顺序是从上往下,加载完按钮节点才执行的js,所以当 ...

  3. spring初始化顺序

    首先,Spring bean的默认加载顺序是怎么控制的 工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事 ...

  4. arm-linux-3.4.2移植for2440

    ----------------------------2440 上内核3.4.2移植------------------------ PS:因wifi项目中无wifi驱动,需新内核. 1.首先在内核 ...

  5. 转载:Android应用的自动更新模块

    软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很 ...

  6. javaScript之Array方法

    Array类型和其他语言一样,是数据的有序列表,但不同的是数组的每一项们可以保存任何类型的数据. 1.检测方法(确定某个对象是不是数组) (1)value instanceof Array (2)Ar ...

  7. 生物数据库介绍——NCBI

    NCBI(National Center for Biotechnology Information,美国国家生物技术信息中心)除了维护GenBank核酸序列数据库外,还提供数据分析和检索资源.NCB ...

  8. Spring入门第二十五课

    使用具名参数 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.jdbc.Dr ...

  9. Windows使用Github

    首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global user.name "你的名 ...

  10. 31.TCP/IP 三次握手与四次挥手

    TCP/IP三次握手 TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手 ...