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
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
思路:
-
定义四个方向
-
从(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
- to_string()获得最小字符串;
- 执行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:
输入: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;
}