当前位置: 首页 > news >正文

笔试题笔记#4、5 记录划水过程

1 一道必须手模双向链表才能过的题,还必须是C++ 

#include <iostream>

using namespace std;

const int N = 100010;
int l, r;
int n;

// 每个节点的左节点和右节点
int L[N], R[N];
// 节点是否已经被使用
int ud[N];
// 剩余节点数量,当前起始节点,当前末尾节点
int remain, beg, ed;

int main()
{
  cin >> l >> r;
  
  // 建立“链表”关系
  for(int i=l; i<=r; i++) {
    L[i] = i-1;
    R[i] = i+1;
  }

  cin >> n;
  
  beg = l, ed = r;
  remain = r-l+1;

  for(int i=0; i<n; i++) {
    int op, v;
    cin >> op >> v;
    if(op == 1) {
      // 不够分配
      if(remain < v) continue;
      while(v--) {
        // “孤立”当前节点
        R[L[beg]] = R[beg];
        L[R[beg]] = L[beg];
        ud[beg] = 1;
        remain--;
        // 更新起始节点
        beg = R[beg];
      }
    } else if(op == 2) {
      if(v < l || v > r || ud[v]) continue;
      // “孤立”当前节点
      R[L[v]] = R[v];
      L[R[v]] = L[v];
      // 如果指定分配的节点是首尾节点,要特殊处理一下
      if(v == beg) beg = R[v];
      else if(v == ed) ed = L[v];

      ud[v] = 1;
      remain--;
    } else {
      if(v < l || v > r || !ud[v]) continue;
      if(remain == 0) {
        // 当前资源全部用完,特殊处理
        beg = ed = v;
      } else {
        // 把当前节点放到最后,建立前后关系
        R[ed] = v;
        L[v] = ed;
        ed = v;
      }
      ud[v] = 0;
      remain++;
    }
  }
  cout << beg << endl;
}

2 一道按位操作的题,可以说是bitset实践了

#include <bits/stdc++.h>
using namespace std;


bitset<1024> a, b;
int n; 
string s;


void print(bitset<1024> x) {
    for(int i = 0 ; i < n ; i ++) {
        cout << x[i]; 
    }
    cout << endl;
}

int main() {
    cin >> n; 
    int idx = 0; 


    while(cin >> s) {
        int now = 0; 
        for(int i = 2 ; i < s.size() ; i ++) { 
            if(s[i] >= '0' && s[i] <= '9') { 
                now = now * 16 + s[i] - '0'; 
            } else { 
                now = now * 16 + s[i] - 'A' + 10; 
            }
        }

        
        stack<int> st;
        for(int i = 0 ; i < 16 ; i ++) { 
            st.push(now & 1); 
            now >>= 1; 
        }
        
        
        for(int i = 0 ; i < 16 && idx < n ; i ++, idx++) {
            a[idx] = st.top(); 
            st.pop();
        }
    }

    
    for(int i = 0 ; i < n ; i ++) {
        b[i] = 1; 
    }

    
    int ans = 0; 
    int ans1 = -1, ans2 = -1; 

    // 枚举右移情况
    for(int i = 0 ; i < n ; i ++) {
        if((a << i & b | a).count() == n) { // 右移i位后,检查是否可以全1
            ans1 = i; // 记录右移的最小位移数
            ans++;
            break; // 只需要找到最少的位移次数,找到即可跳出
        }
    }

    // 枚举左移情况
    for(int i = 0 ; i < n ; i ++) {
        if((a >> i & b | a).count() == n) { // 左移i位后,检查是否可以全1
            ans2 = i; // 记录左移的最小位移数
            ans++;
            break; // 只需要找到最少的位移次数,找到即可跳出
        }
    }

    // 如果没有任何平移方案,或a本身已是全1串,直接输出0
    if(ans == 0 || a.count() == n) {
        cout << 0 << endl;
        return 0;
    }

    // 输出可以使其全1的平移方案数
    cout << (ans1 != -1) + (ans2 != -1) << endl;

    // 输出右移方案
    if(ans1 != -1) {
        cout << "+" << ans1 << endl;
        print((a ^ b) >> ans1); 
    }

    // 输出左移方案
    if(ans2 != -1) {
        cout << "-" << ans2 << endl;
        print((a ^ b) << ans2); 
    }
}

3 C++复习:继承、多态、多重继承相关

相关文章:

  • 11苍穹外卖之Apache ECharts(数据可视化图表、后端传数据)
  • 批量修改mysql字符串字段子字符串
  • PhotoShop中创建窗口使用对应按钮创建对应图层简单示例
  • Linux 设置静态IP
  • 01什么是DevOps
  • JVM组成
  • 学习总结三十三
  • 如果需要保护多个域名怎么办?
  • 基于C++实现的(控制台)植物大战僵尸游戏(高级程序设计)
  • 大预言模型|微调大预言模型初探索(LLaMA-Factory)(1)
  • Centos7安装Clickhouse单节点部署
  • 深度整理总结MySQL——Expalin指南(一)
  • 域森林基础及环境搭建
  • 美颜SDK技术深度解析:从滤镜算法到实时渲染优化
  • qt 事件的传递顺序
  • python学opencv|读取图像(六十六)使用cv2.minEnclosingCircle函数实现图像轮廓圆形标注
  • 《战神:诸神黄昏》游戏闪退后提示弹窗“d3dx9_43.dll缺失”“找不到d3dx11_43.d”该怎么处理?
  • Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件
  • git 沙盒 下(二)
  • kong插件详解之Basic Authentication
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准
  • 2025上海科技节本周六启幕,机器人和科学家同走AI科学红毯
  • 上海现有超12.3万名注册护士,本科及以上学历占一半
  • 美英贸易协议|不,这不是一份重大贸易协议
  • 湛江霞山通报渔船火灾:起火船舶共8艘,无人员伤亡或被困