leetcode58-61

58. 最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。、

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

思路 :

1 首先找到最后且不是空格的位置 j

2 已位置 j从后往前遍历,直到该位置是空格结束

int lengthOfLastWord(string s) {
        int res = 0;
        int j=s.size()-1;
        while(j>=0 && s[j]==' ') j--;
        for(int i=j;i>=0 && s[i]!=' ';i--)
            res++;
        return res;
    }
59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:

img

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

思路:

  1. 定义四个方向

  2. 从(0,0)出发,当未越界或者该位置已经走过,改变为下一个方向,继续开始走;

    vector<vector<int>> generateMatrix(int n) {
            vector<vector<int>> res(n,vector<int>(n));
            int dx[4] = {0,1,0,-1},dy[4] = {1,0,-1,0};
            int d = 0;
            int x=0,y=0;
            for(int i=1;i<=n*n;i++)
            {
                res[x][y] = i;
                int a = x+dx[d],b= y+dy[d];
                if(a<0 || a>=n || b<0 || b>=n || res[a][b])
                {
                    d=(d+1)%4;
                    a = x+dx[d],b=y+dy[d];
                }
                x = a,y = b;
            }
            return res;
        }
    
60. 排列序列

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

思路1

  1. to_string()获得最小字符串;
  2. 执行k-1次next_permutation(res.begin(),res.end())

next_permutation()可以获得下一次的字典序

  string getPermutation(int n, int k) {
        string res;
        for(int i=1;i<=n;i++)   res+=to_string(i);
        for(int i=0;i<k-1;i++)
        {
            next_permutation(res.begin(),res.end());
        }
        return res;
    }

思路2

在这里插入图片描述

string getPermutation(int n, int k) {
        string res;
        bool st[n+1];
        memset(st,false,sizeof st);
        for(int i=0;i<n;i++)
        {
            int fact = 1;
            for(int j=1;j<=n-i-1;j++) fact*=j;
            
            for(int j=1;j<=n;j++)
            {
                if(!st[j])
                {
                    if(fact<k) k-=fact;
                    else
                    {
                        st[j] = true;
                        res+=to_string(j);
                        break;
                    }
                }
            }
        }
        return res;
    }
61. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

img

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

思路:

k=1 就相当于把后面的节点往前移动一个,按照这个思路画图模拟

当k很大时,把k模到n以内

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

ListNode* rotateRight(ListNode* head, int k) {
        int n = 0;
        ListNode* tail;        
        for(auto p=head;p;p=p->next) 
        {
            n++;
            tail = p;
        }
        if(n==0) return head;
        k=k%n;
        if(!k) return head;
        
        auto p=head;
        for(int i=0;i<n-k-1;i++) p = p->next;

        tail->next = head;
        head=p->next;
        p->next = nullptr;

        return head;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工具人来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值