看着简单,注意细节就行!
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,加油!!!