剑指 week2

1.机器人的运动范围

是数位和,裸BFS,用pair<int,int>存下标

class Solution {
public:
    int book[55][55];
    
    int get_sum(pair<int,int>p)
    {
        int s=0,num1=p.first,num2=p.second;
        while(num1)
        {
            s+=(num1%10);
            num1/=10;
        }
        while(num2)
        {
            s+=(num2%10);
            num2/=10;
        }
        return s;
    }
    
    int movingCount(int threshold, int rows, int cols)
    {
        memset(book,0,sizeof book);
        queue<pair<int,int> >q;
        if(!rows||!cols)    return 0;
        
        int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
        int res=0;
        q.push({0,0});
        while(!q.empty())
        {
            auto top=q.front();
            q.pop();
            if(book[top.first][top.second]||get_sum(top)>threshold) continue;
            book[top.first][top.second]=1;
            res++;
            for(int i=0;i<4;i++)
            {
                int newx=top.first+dx[i],newy=top.second+dy[i];
                if(newx>=0&&newx<rows&&newy>=0&&newy<cols)
                    q.push({newx,newy});
            }
            
        }
        return res;
    }
};

2.剪绳子

class Solution {
public:
    int maxProductAfterCutting(int length) {
        //dp[i]表示绳子长度为i的最大乘积i~[2,n]
        //由于必须切一刀,假设切在j位置,左边长度为j,则右边长度为i-j,对于右边长度,可切可不切
        //dp[i]=max( j*(i-j) ,j*dp[i-j] )
        int dp[length+10];
        memset(dp,0,sizeof dp);
        for(int i=2;i<=length;i++)
        {
            for(int j=1;j<i;j++)
            {
                dp[i]=max(dp[i],max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[length];
    }
};

3.二进制中1的个数

采用unsigned int转化为无符号整数

class Solution {
public:
    int NumberOf1(int _n) {
        unsigned int n=_n;
        int res=0;
        while(n)
        {
            if(n&1)res++;
            n>>=1;
        }
        return res;
    }
};

4.快速幂

注意如果指数是负数的话,需要取倒数

class Solution {
public:
    double Power(double x, int n) {
        typedef long long ll;
        bool is_min=n<0;
        double res=1;
        ll k=abs(ll(n));
        while(k)
        {
            if(k&1)
                res*=x;
            x*=x;
            k>>=1;
        }
        if(is_min)  res=1/res;
        return res;
    }
};

5.在O(1)时间复杂度内删除链表结点

由于是单链表,因此我们无法找到它的前驱节点,我们可以换一种思路,将下一个节点的值复制到当前节点,然后将下一个节点删除即可。

时间复杂度为:O(1)

class Solution {
public:
    void deleteNode(ListNode* node) {
        auto p=node ->next;
        node->val=p->val;
        node->next=p->next;
        delete p;
    }
};

6.删除链表中的重复的节点

定义一个虚拟头节点(dummy),防止头节点被删除,然后往后扫描整个链表(p),每次扫描元素相同的一段,如果这段中的元素个数多于1个,则将整段元素直接删除。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        auto dummy=new ListNode(-1);
        dummy->next=head;
        
        auto p=dummy;
        while(p->next)
        {
            auto q=p->next;
            while(q&&q->val==p->next->val) q=q->next;//q存在不要忘记掉
            //间隔一个
            if(p->next->next==q)    p=p->next;
            //删掉大于等于2的间隔
            else
                p->next=q;
        }
        return  dummy->next;
        
    }
};

7.正则表达式匹配

对于这一类两个字符串匹配问题,可以用二维动态规划来写

状态表示:dp[i][j]表示s[i....]和p[j.....]匹配

状态计算:

  • 1.p[j]是正常字符,dp[i][j]=s[i]==p[j]&&dp[i+1][j+1]
  • 2.p[j]是' . ' , dp[i][j]=dp[i+1][j+1]
  • 3.p[j+1]是' * '(p[j]是b * 这样的形式)
    第一种出现0次, dp[i][j]=dp[i][j+2] ( 跳两个格子 )
    第二种出现>=1次, dp[i][j]=dp[i+1][j]

8.调整数组顺序使奇数位于偶数前面

类似于快排的思想,利用两个指针,其中第一个指针从前往后找,第二个指针从后往前找,第一个指针遇到的为偶数,第二个指针遇到的是奇数,且满足不相遇,就把这两个指针交换

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int l=0,r=array.size()-1;
        while(l<r)
        {
            while(l<r&&array[l]%2==1)l++;
            while(l<r&&array[r]%2==0)r--;
            if(l<r)
                swap(array[l],array[r]);
        }
         
    }
};

9.链表中倒数第k个节点

双指针

class Solution {
public:
    ListNode* findKthToTail(ListNode* pListHead, int k) {
        ListNode* fast=pListHead,*slow=pListHead;
        while(k--&&fast)
            fast=fast->next;
        if(k>=0) return NULL;
        else
        {
            while(fast)
            {
                fast=fast->next;
                slow=slow->next;
            }
        }
        return slow;
    }
};

10.链表中环的入口地址

哈希表

class Solution {
public:
    unordered_map<ListNode *,int>mp;
    ListNode *entryNodeOfLoop(ListNode *head) {
        for(auto i=head;i;i=i->next)
        {
            if(mp[i]!=0)
            {
                return i;
            }
            else
            {
                mp[i]=1;
            }
        }
        return NULL;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1.找出数组中重复的数字[https://www.acwing.com/problem/content/descr...
    Tsukinousag阅读 162评论 0 1
  • 1. 二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,...
    deactivateuser阅读 1,626评论 0 3
  • 作为动态规划习题册 目录 1.luogu1417烹调方案[https://www.luogu.com.cn/pro...
    _NewMoon阅读 181评论 0 1
  • 第三周题做完了,总结一下。acwing35 反转链表题目:https://www.acwing.com/probl...
    风之羁绊阅读 210评论 0 0
  • 27. 二叉树的镜像 求一棵树的镜像的过程:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子...
    oneoverzero阅读 235评论 0 2