2022-02-28每日刷题打卡
飞书——每日一题
670. 最大交换
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
把数转换成字符串,以开头为起点,遍历字符串,找到最大的字符并记下下标,如果最大的字符和起点的字符不相同且两者下标不一样就把这俩字符交换,并把字符串转换成数字返回。如果最大的字符和起点字符相同或下标一样(说明已经不能通过更改这个位置使得数字变得更大了,这样就去找下一个位置),则把起点往前推一格然后重复开头操作。
class Solution {
public:
int maximumSwap(int num) {
string str=to_string(num);
int n=str.size(),ans=0,res=0;
while(res<n)
{
char c=str[res];
for(int i=res+1;i<n;i++)
if(c<=str[i])
{
c=str[i];
ans=i;
}
if(res<ans && str[ans]!=str[res])
{
swap(str[ans],str[res]);
break;
}
else
res++;
}
return stoi(str);
}
};
代码源——Div2每日一题
前两天在赶飞机,补一下
特殊的正方形 - 题目 - Daimayuan Online Judge
输入n,输出n行n列的由+
和.
组成的正方形,其中最外面一圈全是+
,第二圈全是.
,…,对于第ii圈,如果ii是奇数,那么全是+
,否则全是.
。
输入格式
一行,一个整数n。
输出格式
n行,为满足题目要求的正方形。注意不要有行末空格。
样例输入
10
样例输出
++++++++++
+........+
+.++++++.+
+.+....+.+
+.+.++.+.+
+.+.++.+.+
+.+....+.+
+.++++++.+
+........+
++++++++++
数据范围
对于100%的数据,保证2≤n≤100。
按规矩打印就行。我这里是从外到内一圈圈赋值后一起打印出来。拿两个变量l=0,r=n-1,对应当前赋值的那一圈正方形的边界,每次赋完这一圈后,两个变量向中心收缩(l++,r–)。
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<set>
#include<unordered_map>
#include<stack>
const int N = 110;
char f[N][N];
int main()
{
int n;
cin >> n;
int up = 0, m = n, l = 0, r = n - 1, down = n-1;
char s[] = { '+','.' };
while (m>=0)
{
char c = s[l % 2];
for (int i = 0; i < m; i++)
{
f[l + i][r] = c;
f[l + i][l] = c;
f[l][l+i] = c;
f[r][l+i] = c;
}
l++, r--;
m -= 2;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << f[i][j] ;
cout << endl;
}
return 0;
}
走楼梯2 - 题目 - Daimayuan Online Judge
楼梯有 n 阶,上楼可以一步上一阶,也可以一步上二阶。
但你不能连续三步都走两阶,计算走到第n阶共有多少种不同的走法。
输入格式
一行,一个数字,表示n。
输出格式
输出走楼梯的方式总数。
样例输入
6
样例输出
12
数据规模
对于100%的数据,保证n≤50。
和正常的走楼梯问题不同的就是不能连续走3次两阶,我们准备一个N*3的二维数组,i取02,意思是最后一步连续走了i个2步(因为不能连走三次,所以只能取02),j取1~n,意思是当前在第j层,f[i] [j]的意思是,最后一步连续走了i个两步走到了第j层。
状态转移:f[0] [j]因为最后一步走的不是第二步,所以可以通过上一层的f[0] [j-1]+f[1] [j-1]+f[2] [j-1]得到(上一层走一步就可以到了,而不管上一层的最后一步是啥,走完这一步后最后一步都是一步,所以i=0),f[1] [j]因为最后一步走的是2,所以就等于上上层的f[0] [j-2](因为最后一步是走了一次两步,所以只能通过上上层走一次两步得到,而因为最后一步只连续走了一次两步,所以只能通过f[0]得到,如果是f[1],最后一步再走一次两部就会变成f[2]),f[2] [j]因为最后一次走了两次两部,所以可以通过上上层的f[1] [j-2]得到(道理同上)。
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<set>
#include<unordered_map>
#include<stack>
typedef long long ll;
const int N = 110;
ll f[3][N];
int main()
{
int n, ans = 1;
cin >> n;
f[0][1] = 1, f[1][1] = 0, f[2][1] = 0;
f[0][2] = 1, f[1][2] = 1, f[2][2] = 0;
f[0][3] = 2, f[1][3] = 1, f[2][3] = 0;
f[0][4] = 3, f[1][4] = 1, f[2][4] = 1;
for (int i = 5; i <= n; i++)
{
f[0][i] = f[0][i - 1] + f[1][i - 1] + f[2][i - 1];
f[1][i] = f[0][i - 2];
f[2][i] = f[1][i - 2];
}
cout << f[0][n] + f[1][n] + f[2][n];
return 0;
}