leetcode题解日练--2016.6.17

2023-05-16

编程新手,尽量保证每天至少3道leetcode题,仅此记录学习的一些题目答案与思路,尽量用多种思路来分析解决问题,不足之处还望指出。

今日题目:1、罗马数字转整数;2、找BST的最低祖先;3、统计数字二进制表示中1的个数

13. Roman to Integer Difficulty: Easy

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
题意:将罗马数字转换成阿拉伯数字
思路:
罗马数字有如下符号:
Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)
罗马数字的计数规则:
1.若干相同数字连写表示的数是这些罗马数字的和,如III=3;
2.小数字在大数字前面表示的数是用大数字减去小数字,如IV=4;
3.小数字在大数字后面表示的数是用大数字加上小数字,如VI=6;
刚拿到这道题,感觉没什么思路,因为罗马数字感觉与我们平常用的阿拉伯数字相比最大的区别是没有进制,参考了http://blog.sina.com.cn/s/blog_7025794a0101397g.html的思路,自己从1数到100,发现了一些规律
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9

X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99

C,100
规律就是,从前往后遍历罗马数字,如果某个数比前一个数小,则把该数加入到结果中;反之,则在结果中两次减去前一个数并加上当前这个数;
代码:

class Solution {
public:
    int romanToInt(string s) {
        int result = 0;
        string roman = "IVXLCDM";
        int count[] = {1,5,10,50,100,500,1000};
        result +=count[roman.find(s[0])];
        for(int i=1;i<s.length();i++)
        {
            result+=count[roman.find(s[i])];
            int order_prev = roman.find(s[i-1]);
            int order = roman.find(s[i]);
            if (order>order_prev)
                result-=(2*count[roman.find(s[i-1])]);
        }
        return result;
    }
};
结果:40ms,Your runtime beats 72.99% of cppsubmissions.

第二次刷本题代码

class Solution {
public:
    int romanToInt(string s) {
        int n = s.size();
        int count[] = {1,5,10,50,100,500,1000};
        string roman = "IVXLCDM";
        int res = 0;
        for(int i=0;i<n;i++)
        {
            int num = count[roman.find(s[i])];
            res+=num;
            if(i+1<n&&roman.find(s[i])<roman.find(s[i+1]))  res-=2*num;
        }
        return res;
    }
};

235.Lowest Common Ancestor of a Binary Search Tree Difficulty: Easy

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
题意:给定一棵二叉查找树,找到两个给定节点的最低公共祖先。
__6_
/ \
_2 _8 2和8的最低公共祖先是6,2和4的最低公共祖先是2
/ \ / \
0 _4 7 9
/ \
3 5
思路:这题在《剑指offer》中第50题出现了,因为是二叉查找树,难度降低了很多。我们只需从根节点开始,遍历这棵树,当查询的两个节点不同为某个根节点的子节点的某一侧,即不同位左节点或者不同为右节点的时候,就认为该节点是查询的两个节点的最低公共祖先。
代码:
递归版本

/**
 * 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:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* pNode = root;
        if (pNode->left==NULL&&pNode->right==NULL)
            return NULL;
        if(!((p->val>pNode->val&&q->val>pNode->val)||(p->val<pNode->val&&q->val<pNode->val)))
            return pNode;
        else if(p->val>pNode->val&&q->val>pNode->val)    
            return lowestCommonAncestor(pNode->right,p,q);
        else 
            return lowestCommonAncestor(pNode->left,p,q);        
    }
};
结果:44ms,Your runtime beats 14.12% of cppsubmissions

迭代版本

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* pNode = root;
        while(pNode)
        {
            if(p->val>pNode->val&&q->val>pNode->val)
                pNode = pNode->right;
            else if(p->val<pNode->val&&q->val<pNode->val)
                pNode = pNode->left;
            else
                return pNode;
        }
        return NULL;
    }
};
结果:44ms,Your runtime beats 14.12% of cppsubmissions
是否有更快的解法暂时没进行深究。

191.Number of 1 Bits Difficulty: Easy

Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11’ has binary representation 00000000000000000000000000001011, so the function should return 3.
题意:很简单,就是求32位整型数字的二进制表示中1的个数
思路:这是一道位运算的巧妙运用
1、容易想到的思路,每次将n和1进行亦或运算,会发现除了最低位之外的其他位置保持不变,最低位取反,如果原来最低位是1那么取反后一定比原来的数要小,满足条件就计数一次,然后将n右移一位,程序中需要注意不要越界,时间复杂度O(N);
2、只要数字不为0,每次进行 n&(n-1)的操作,如(5&4就是101&100=100),我们发现1的个数已经减少了1,进行一次计数之后更新n的值进行下一次循环,这样复杂度降到了O(K)。
代码:
1、

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int result=0;

        while(n!=0)
        {
            int tmp = n^1;
            if(tmp<n)
                result++;
            n = n>>1;
        }
        return result;
    }
};
结果:4ms  Your runtime beats 55.73% of cppsubmissions.

2、

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int result=0;

        while(n!=0)
        {
            n = n&(n-1);
            result++;
        }
        return result;
    }
};
结果:8ms  Your runtime beats 4.95% of cppsubmissions
我个人觉得方法二会比方法比方法一快,但是不知道为什么最后确反而慢了,明天再思考一下
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode题解日练--2016.6.17 的相关文章

随机推荐

  • 各种排序混合---冒泡排序、选择排序、插入排序

    冒泡排序 不多说 xff0c 看代码 xff0c 就是把最大的数字或者最小的数字沉到最右边 xff0c 最后输出数组 include lt iostream gt include lt stdlib h gt include lt math
  • 【PyQt5】串口数据实时绘图

    常见的串口调试助手一般只有简单的文本界面 xff0c 偶然看到 Arduino IDE 自带的串口绘图工具 xff0c 觉得用户设计挺友好 想着利用一下周末空闲时间 xff0c 用 PyQt5 实现一个串口数据实时绘图小工具 xff0c 在
  • HTTPS、HTTPS、SSH、MSTSC等常用网络服务的端口号

    前言 今天在 powershell下使用curl命令访问 一个网址 返回 443 port 相关的错误信息 xff0c 我第一眼看 xff0c 还以为是HTTP STATUS CODE 于是去查了一会儿才发现 xff0c 是端口号的问题 下
  • vue服务端渲染——基础

    文章目录 vue服务端渲染 xff08 基础 xff09 Nuxt框架文件目录结构项目启动 打包生命周期SSRnuxtserverInitmiddleware 中间件全局中间件页面级中间件 validate 校验参数asynData校验参数
  • 变压变频调速的原理(VVVF)——基础补充

    1 变压变频调速系统的基本原则 xff1a 维持气隙磁通不变 根据电磁感应原理 xff0c 气隙磁通在定子绕组每相绕组中的感应电动势为 xff1a Fs 为定子频率 xff0c Ns 为定子每相绕组串联匝数 xff0c Kns为基波绕组系数
  • RIA迷你书序言

    RIA Minibook Prologue RIA迷你书序言 Rich Internet Applications or RIAs have truly revolutionized user experiences online When
  • Tensorflow版本和python对应关系,以及tensorflow下载路径

    A few installation mechanisms require the URL of the TensorFlow Python package The value you specify depends on your Pyt
  • 串口的应用层操作

    一 设备中一般会用第二串口与外设通信 需要可以配置波特率 xff0c 实现应用层面的串口读写 二 代码实现 span class token macro property span class token directive hash sp
  • 委托与事件

    委托与事件 一 委托 xff08 delegate xff09 1 委托是一种可以把引用存储为函数的类型 2 在定义了委托后 xff0c 就可以声明该委托类型的变量 xff0c 接着把这个变量初始化为与委托有相同返回类型和参数类别的函数引用
  • 类域

    class String public 错误 名字 index type 还没有被声明 char amp operator index type typedef int index type 在类定义中用到的名字必须在使用前首先被声明这个规
  • 怎样把自己写的组件、库推到npm服务上面,并给别人使用?

    1 创建npm账号 2 cmd命令行到某个文件夹下 xff0c 然后登录 span class nx npm span span class nx login span 3 npm init填写包名 xff0c 以及一些信息 4 通过npm
  • 浅析 耦合 紧耦合 松耦合 解耦

    耦合 指模块之间的依赖关系 xff0c 包括控制关系 调用关系 数据传递关系 模块间联系越多 xff0c 其耦合性越强 xff0c 同时表明其独立性越差 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准 划分模块的一个准则就是高内聚
  • 机器人视觉项目:视觉检测识别+机器人跟随(1)

    更新一波暑假做的机器人视觉检测跟随的项目 xff0c 有一些笔记都放在博客中 xff0c 有需要的可以交流 项目的目的是在机器人上搭建视觉检测系统 xff0c Kinect 43 ros 43 深度学习目标检测 43 行人识别 xff08
  • 机器人视觉项目:视觉检测识别+机器人跟随(17)

    参考一个实例行人检测 在ubuntu 43 ros环境下 xff0c 利用RGBD采集数据给小车 xff0c 实现行人跟随 原作者开源的例子是出现一个窗口 xff0c 用鼠标选择一个区域做kcf跟随 xff0c 选择的物体不受限制 xff0
  • UNIX系统中进程由哪三部分组成

    在UNIX系统中进程由以下三部分组成 xff1a 进程控制块PCB xff1b 数据段 xff1b 正文段 UNIX系统为了节省进程控制块所占的内存空间 xff0c 把每个进程控制块分成两部分 一部分常驻内存 xff0c 不管进程是否正占有
  • MAVLink.io(4)--MAVLlink Version

    MAVLink Version 版本 MAVLink发展处几个版本 xff1a MAVLink 2 0 目前推荐的主要版本 xff0c 2017被大部分用户接受 MAVLink v1 0 2013年被广泛接受 xff0c 一直被大批设备采用
  • sourceTree使用教程详解

    SourceTree是最好用的版本管理客户端软件 xff0c 没有之一 本人将以连载经验的形式来详细讲述如何利用sourceTree去进行代码或文件的版本管理 教程一将讲述 克隆 xff0c 提交 xff0c 和推送 一 SourceTre
  • Flex的危局,还是HTML5的盛宴?

    为InfoQ的RIA迷你书写序 xff0c 似乎是我的宿命 由于工作原因把这个任务推迟了一段时间之后 xff0c 后果居然是不仅写了序 xff0c 还成为了另一篇序的译者 互联网10年 xff0c 始于2000年 对于互联网来说 xff0c
  • git pull 覆盖本地代码

    在使用Git的过程中 xff0c 有些时候我们只想要git服务器中的最新版本的项目 xff0c 对于本地的项目中修改不做任何理会 xff0c 就需要用到Git pull的强制覆盖 xff0c 具体代码如下 xff1a git fetch a
  • leetcode题解日练--2016.6.17

    编程新手 xff0c 尽量保证每天至少3道leetcode题 xff0c 仅此记录学习的一些题目答案与思路 xff0c 尽量用多种思路来分析解决问题 xff0c 不足之处还望指出 今日题目 xff1a 1 罗马数字转整数 xff1b 2 找