Day 3
6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
利用二维矩阵来模拟,首先得计算出矩阵的大小
已知 行数为 r,周期 t 即为 r + r -2;再根据周期计算得出 列数c 为 (n + t - 1 ) / t * ( r - 1 )
遍历 s ,并且对下标进行判断,若 i mod t < r -1 ,就向下移动(列++),反之则向右上角移动(列–,行++)
最后用一个 string 遍历矩阵中非空的元素,返回即可
class Solution {
public:
string convert(string s, int numRows) {
int n = s.length();
int r = numRows;
if(r == 1 || r >= n)
{
return s;
}
int t = r+r-2;
int c = (n + t - 1)/t * (r-1);
vector<string> mat(r,string(c,0));
for(int i = 0,x = 0,y = 0;i < n;++i)
{
mat[x][y] = s[i];
if(i % t < r - 1)
{
++x;
}else{
--x;
++y;
}
}
string ans;
for(auto &row : mat)
{
for(char ch:row)
{
if(ch)
{
ans += ch;
}
}
}
return ans;
}
};
977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
遍历,然后对每个数据进行平方赋值,再用 sort 进行排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0;i < nums.size();i++)
{
long int n = nums[i];
n = n * n;
nums[i] = n;
}
sort(nums.begin(),nums.end());
return nums;
}
};
189. 轮转数组
给你一个数组,将数组中的元素向右轮转
k
个位置,其中k
是非负数。
以 k 为分界线,先全部倒置,再对 0 ~ k-1 的数据倒置,最后对 k ~ nums.size()-1 的后几位倒置
class Solution {
public:
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start += 1;
end -= 1;
}
}
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};