目录
各位程序员1024节日快乐!!!
开心果: (\\v\\)~~
偶然间看见一道大一新生的编程题 ( 怎么这么简单
题目的要求是不使用判断条件
( 不得不说这很 leetcode, 只用求余算法使得: z+1 -> y ... ... a+1 -> z
#include<bits/stdc++.h>
signed main(void){
char a; std::cin >> a;
long long b; std::cin >> b; //卡了int
b = -b; //正向思维 , 要使得 'a' + 1 == 'z' 就是颠倒符号位
b = b % 26; //26为一次循环 , 所以多余26的 "整数部分不需要"
b = (b + 26) % 26; //最为关键的一步 , 也就是去判断条件的步骤: 'a' - 2 == 'a' + 24 (转换成b全为正数 , 则可以正常取模
putchar((a - 'a' + b) % 26 + 'a'); //正常的求余
return 0;
}
计组部分:
CPU的五大主要部件 : a. 运算部件; b. 缓存部件; c. 控制部件; d. 寄存器; e. 时序系统;
ALU: 计算器 (处理 数据 和 数据的地址
缓存部件: 目前计算机通用 三级缓存 并且 存在该关系 三级缓存 > 二级缓存 > 一级缓存 (不设立更多级缓存的原因: a. 错误率高; b. 占用空间大; c. 结构复杂.
寄存器组(堆): 主要有 a. 通用寄存器组; b. 暂存器; c. 指令寄存器; d. 程序计数器; e. 程序状态字寄存器; f. 地址寄存器; g. 数据缓冲寄存器; h. 堆栈指针寄存器. 并且只有 通用寄存器组 和 暂存器 可以存在 多个 , 而其余的 只能存在一个.
leetcode每日一题:
找规律 , 因为数据不大 , 所以极大可能是打表题. (一种自我反应) 而当你暴力寻找到最大数值1e6 的值为1224444就更加可以确定是打表题了 , 接下来你只需要把所有小于1224444的满足条件的数保存下来 , 取upper_bound就可以了.
class Solution {
public:
vector<int>nums={1,22,122,212,221,333,1333,3133,3313,3331,4444,14444,22333,23233,23323,23332,32233,32323,32332,33223,33232,33322,41444,44144,44414,44441,55555,122333,123233,123323,123332,132233,132323,132332,133223,133232,133322,155555,212333,213233,213323,213332,221333,223133,223313,223331,224444,231233,231323,231332,232133,232313,232331,233123,233132,233213,233231,233312,233321,242444,244244,244424,244442,312233,312323,312332,313223,313232,313322,321233,321323,321332,322133,322313,322331,323123,323132,323213,323231,323312,323321,331223,331232,331322,332123,332132,332213,332231,332312,332321,333122,333212,333221,422444,424244,424424,424442,442244,442424,442442,444224,444242,444422,515555,551555,555155,555515,555551,666666,1224444};
int nextBeautifulNumber(int n) {
return nums[upper_bound(nums.begin() , nums.end() , n) - nums.begin()];
}
};
codeforces积累:
题目意义: 在给定的 string 字符串中 , 删除一种字母的最少个数 , 使得剩下的 string 子序列是回文的.
解题: 因为只有26种删除方式 , 所以第一步则是遍历26种字母分别全部删除的情况. 在进行完该操作后 , 判断剩下的字符串是不是回文的 , 如果不是回文字符串 , 删除这种字符(c)就一定不能满足要求; 但如果是回文字符串 , 就应该寻找最优解 ( 删除的该字符如果 重新加进字符串 依然是一个回文的字符串 , 则更新最优解.
*寻找能再放入字符串的已经删除的字符的方式是: u == v 的情况 ( u 为左边不等于 c 的 字符的个数 , v 为右边不等于 c 的 字符的个数
#include<bits/stdc++.h>
using namespace std;
signed main(void){
int t; cin >> t;
while(t --){
int n; cin >> n;
string str; cin >> str;
int cut = str.length();
int h = 1;
int l = 0 , r = n - 1;
while(l < r){
if(str[l] != str[r]){ h = 0; break; }
l ++ , r --;
}
if(h){ cout << 0 << endl; continue; }
for(int i = 0;i < 26;i ++){
string s;
for(int j = 0;j < str.length();j ++){
if(str[j] != i + 'a') s += str[j];
}
int left = 0 , right = s.length() - 1 , ans = 1;
while(left < right){
if(s[left] != s[right]){ ans = 0; break; }
left ++ , right --;
}
if(!ans) continue;
int m = s.length();
left = 0 , right = str.length() - 1;
int u = 0 , v = 0;
while(left <= right){
// cout << u << ' ' << v << left << ' ' << right << endl;
if(left != right && str[left] == str[right] && str[left] == 'a' + i && u == v) m += 2;
else if(left == right && str[left] == str[right] && str[left] == 'a' + i && u == v) m ++;
if(u < v){
if(str[right] != i + 'a') u ++;
right --;
}
else if(u > v){
if(str[left] != i + 'a') v ++;
left ++;
}
else{
if(str[left] == i + 'a' && str[right] == str[left]) left ++ , right --;
else if(str[left] == i + 'a'){
if(str[right] != i + 'a') u ++;
right --;
}
else{
if(str[left] != i + 'a') v ++;
left ++;
}
}
}
if(ans) cut = min(cut , n - m);
}
if(cut != n) cout << cut << endl;
else cout << -1 << endl;
}
return 0;
}
没有一个冬天不可跨越 没有一个春天不会来临.Day Two -- 道初心莫负.