牛客习题总结29(7月2号)

在这里插入图片描述
同一个进程中的两个线程,全局数据区和堆是相互可见的,栈并不是相互可见的。
程序计数器是用于存放下一条指令的地址的寄存器。

在这里插入图片描述
在这里插入图片描述

在采用虚拟存储技术的存储系统中,一个多任务的操作系统经常将多个不同的程序同时调入主存执行,因此,首先需要保证这些程序间不会相互覆盖,并且,一个程序不能访问其他程序的数据以及不是分配给他的主存区域。其次,一个程序出错不会破坏其他用户程序和系统程序。通过一些限制方式保护主存中程序的技术被称为存储保护。简单的说,存储保护就是对主存中的程序和数据进行保护。为了降低开销,在进行存储保护的时候,通常不会直接保护单个存储单元,而是以页或者段为单位进行保护。
在这里插入图片描述

基址寻址,将CPU中基址寄存器的内容,加上指令格式中的形式地址而形成操作数的有效地址。
被引用的专用寄存器含有一个存储器地址,地址字段含有一个相对于该地址的偏移量(通常是无符号的整数)。寄存器的引用可以使显式的,也可以是隐式的。
基址寻址方式,主要用来解决程序的动态定位问题。
在多道程序的环境下,用户不可决定自己使用的主存区,因而在编程时常按(以零为基准地址)相对地址来编写,当程序被放入主存时,操作系统根据主存空间情况给基址寄存器赋值,从而将虚地址转化为实地址。
在这里插入图片描述
如果系统只有用户态线程,则线程对操作系统是不可见的,操作系统只能调度进程;
如果系统中有内核态线程,则操作系统可以按线程进行调度;

在这里插入图片描述

在这里插入图片描述

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            int N = in.nextInt();
            int ret = N*N;
            int x = 10;
            while(ret%x!=N&&ret%x!=ret) {
                x = x*10;
            }
            if(ret%x == N) {
                System.out.println("Yes!");
            }else {
                System.out.println("No!");
            }
        }
    }
}

在这里插入图片描述
这一步是关键,ret为N的平方,先取余10,如果不等于N并且不等于本身,就让X乘以10,继续执行上述操作,当等于N,说明就是低位等于N,是守形数,如果等于本身,说明这个数低位不存在本身,就退出循环,最后退出循环判断,如果取余X等于N,说明是因为低位等于N而退出循环的,就是守形数,否则就不是。
在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;
public class Main1 {
    public static boolean checkLength(String s) {

        if(s.length()>8) {
           return true;
        }else {
           return false;
        }
    }
    public static boolean checkKinds(String s) {
        int x = 0;
        int y = 0;
        int z = 0;
        int w = 0;
        for(int i = 0;i<s.length();i++) {
            if(s.charAt(i)>='a'&&s.charAt(i)<='z') {
                x = 1;
                continue;
            }
            if(s.charAt(i)>='A'&&s.charAt(i)<='Z') {
                y = 1;
                continue;
            }
            if(s.charAt(i)>='0'&&s.charAt(i)<='9') {
                z = 1;
                continue;
            }else {
                w = 1;
                continue;
            }
        }
        if(x+y+z+w>=3) {
          return true;
        }else {
            return false;
        }
    }
    public static boolean checkRepeat(String s) {
        for(int i = 0;i<s.length()-2;i++) {
            String s1 = s.substring(i,i+3);
            if(s.substring(i+2).contains(s1)) {
               return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            String s = in.nextLine();
            if(checkLength(s)&&checkKinds(s)&&checkRepeat(s)) {
                System.out.println("OK");
            }else {
                System.out.println("NG");
            }
        }
    }
}

我们可以学习一下这种每个条件都用一个函数实现,最后只要判断所有条件是否满足就行了,这种写法使得思路更加清晰,易懂。其中,主要我们关注第三个条件,不能有相同长度超过2的子串重复,我们可以从第一个字符开始遍历,每次截取两个字符作为字符串s1。然后再从它后面截取剩余的字符串,判断里面有没有s1。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhj_loveFang_1105

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值