星期六, 三月 05, 2016

13. Roman to Integer

Given a roman numeral, convert it to an integer.

 

Input is guaranteed to be within the range from 1 to 3999.

 

解题思路:

 

 

 

屏幕剪辑的捕获时间: 2016/3/4 22:52

从左到右,两两进行比较。。。使用map和数组标记两种方式所消耗的时间不同。。

#include<string>

#include<iostream>

#include<map>

using namespace std;

class Solution {

public:

    int romanToInt(string s) {

        int n=s.size();

        if(n==0)return 0;

        // 68ms

        //map<char,int>m;

        //m['I']=1;

        //m['X']=10;

        //m['C']=100;

        //m['M']=1000;

        //m['V']=5;

        //m['L']=50;

        //m['D']=500;

 

        // 32ms

        int m[26]={0};

        m['I'-'A']=1;

        m['X'-'A']=10;

        m['C'-'A']=100;

        m['M'-'A']=1000;

        m['V'-'A']=5;

        m['L'-'A']=50;

        m['D'-'A']=500;

        int ans=0;

        for(int i=0;i<n-1;i++){

            int a=m[s[i]-'A'];

            if(s[i]=='I'||s[i]=='X'||s[i]=='C'){

            int b=m[s[i+1]-'A'];

            if(a<b)ans-=a;

            else

                ans+=a;

            }

            else

                ans+=a;

        }

        ans+=m[s[n-1]-'A'];

        return ans;

    }

};

 

235. Lowest Common Ancestor of a Binary Search Tree

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

 

According to the definition of LCA on Wikipedia: "The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself)."

 

        _______6______

       /              \

    ___2__          ___8__

   /      \        /      \

   0      _4       7       9

         /  \

         3   5

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

 

解题思路:

因为是二叉搜索树,有左子树的所有值都小于父节点的值,右子树的所有值都大于父节点,因此递归判断两个节点在左子树还是右子树,若在两边,则父节点就是其最小公共祖先,否则递归搜索同在一遍的子树。

#include<windows.h>

using namespace std;

struct TreeNode {

    int val;

    TreeNode *left;

    TreeNode *right;

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

  

class Solution {

public:

// 40ms-42ms

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {

        if(root==NULL)return root;

        if(p==NULL)return q;

        if(q==NULL)return p;

        int val=root->val;

        if((val-p->val)*(val-q->val)<=0)return root;

        if(val>p->val)return lowestCommonAncestor(root->left,p,q);

        return lowestCommonAncestor(root->right,p,q);

    }

};

 

191. Number of 1 Bits

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.

 

解题思路:

1bit manipulate  利用n&(n-1)快速去掉最低位的1.

2、使用c++ stl中的bitset类型,将其转换为32位的二进制,利用count方法得到1的个数

3、已知输入为32位无符号的整数,可以知道只要循环32次,求每位是否为1.

#include<stdint.h>

#include<bitset>

using namespace std;

class Solution {

public:

    // 8ms

  //  int hammingWeight(uint32_t n) {

        //bitset<32>ans(n);

        //return ans.count();

  //  }

    // 8ms

    int hammingWeight(uint32_t n) {

        int cnt=0;

        for(;n;n>>=1){

            if(n&1)cnt++;

        }

        return cnt;

    }

    // 4ms

    int hammingWeight(uint32_t n) {

        int cnt = 0;

        for(; n; n >>= 1)

            if(n&1) ++cnt;

        return cnt;

    }

};