北京邮电机试题(持续更新中)

这篇博客介绍了两个编程题目,第一个涉及HDLC协议的01序列处理,需要从处理后的序列中还原原始序列;第二个题目要求计算一个特定数值在特定矩阵中出现的次数,解题思路是通过质因数分解来确定。同时,还分享了一个将int转换为long的技巧,并给出了两个二进制加法的实例。
摘要由CSDN通过智能技术生成

看着简单,注意细节就行!

1. 寻找变化前的01序列

给你一个 01 序列,HDLC 协议处理的话,如果出现连续的 5 个 1 会补 1 个 0。

例如 1111110,会变成 11111010。

现在给你一个经过 HDLC 处理后的 01 序列,你需要找到 HDLC 处理之前的 01 序列。

例如给你 11111010,你需要输出 1111110。

输入格式
第一行一个整数 N,表示共有 N 组测试数据。

每组数据占一行,包含一个 01 序列。

输出格式
每组数据输出一行结果,为处理之前的 01 序列。

数据范围
1≤N≤100,
01 序列长度不超过 100。

输入样例:
2
11111010
1111100
输出样例:
1111110
111110

import java.util.*;
class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while(n-- !=0){
            String s = sc.next();
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < s.length(); i++){
               if(s.charAt(i)=='0'){
                   if(i-5>=0){
                       int cnt = 0;
                       boolean flag = false;
                       for(int j = 1; j <= 5; j++){
                           if(s.charAt(i-j)=='1'){
                              cnt++;
                           }
                       }
                       if(cnt==5){
                           continue;
                       }
                       
                   }
               }
               sb.append(s.charAt(i));
            }
            System.out.println(sb.toString());
        }
    }
}

2.寻找奇特的数

给定一个 n×n 的矩阵 a,其中第 i 行第 j 列的元素 aij 等于 i×j(1≤i,j≤n)。

现在,给定一个整数 m,请你计算 m 在矩阵中出现的次数。

输入格式
第一行一个整数 T,表示共有 T 组测试数据。

每组数据包含两个整数 n,m。

输出格式
每组数据输出一行一个结果,表示 m 在矩阵中出现的次数。

数据范围
1≤T≤20,
1≤n≤105,
1≤m≤109
输入样例:
2
3 6
3 3
输出样例:
2
2

解题思路,这道题求的话先求质因数,然后判断质因数出现的次数即可,记住质因数要小于等于n.



import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- != 0) {
            int n = sc.nextInt();
            int m = sc.nextInt();

            TreeSet<Integer> set = new TreeSet<>();
            int cnt = 0;
                for (int j = 1; j <= m / j; j++) {
                    if (m % j == 0) {
                        set.add(j);
                        set.add(m / j);
                    }
                }
            
            for(int x:set){
                if(x<=n&&m/x<=n){
                    cnt++;
                }
            }
            System.out.println(cnt);
        }
    }
}

3.二进制

这个int转为long挺烦的,不过也可以不用二进制移位算,可以这样做,

long n = 0;
for(int i = 0; i <= 31; i++){
	if(s.charAt(i)=='1'){
			n = n*2+s.charAt(i)-'0';
	}
}
也算是一种小技巧!!!

给定一个长度为 32 位的二进制数 n,请你计算并输出 n+1 和 n+3 的二进制表示结果。

注意,结果不能忽略前导 0(不够 32 位的用前导 0 补足 32 位,超过 32 位的不用补前导 0)。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含一个长度为 32 的 01 字符串。

输出格式
每组数据输出两行,第一行为 n+1 的二进制表示结果,第二行为 n+3 的二进制表示结果。

数据范围
1≤T≤100
输入样例:
2
00000000000000000000000000000000
00000000000000000000000000000001
输出样例:
00000000000000000000000000000001
00000000000000000000000000000011
00000000000000000000000000000010
00000000000000000000000000000100

import java.util.*;
class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while(n-- !=0){
            String s = sc.next();
            long res = 0;
            for(int i = 31; i >= 0; i--){
                if(s.charAt(i)=='1'){
                    res += (long)1 << (31  - i);
                }
            }
            cal(res+1);
            cal(res+3);
            
            
            
        }
    }
    static void cal(long n){
        StringBuilder sb = new StringBuilder();
        for (int i = 32; i >= 0; i -- )
            {
                long t = ((n >> i) & 1);
                if (t==0 && i == 32) continue;
                sb.append(t);
            }
            System.out.println(sb.toString());
    }
    
}

okk,加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值