“21 天好习惯”第一期-2

目录

开心果: (\\v\\)~~

计组部分:

leetcode每日一题:

codeforces积累: 


各位程序员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 -- 道初心莫负.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值