同一个进程中的两个线程,全局数据区和堆是相互可见的,栈并不是相互可见的。
程序计数器是用于存放下一条指令的地址的寄存器。
在采用虚拟存储技术的存储系统中,一个多任务的操作系统经常将多个不同的程序同时调入主存执行,因此,首先需要保证这些程序间不会相互覆盖,并且,一个程序不能访问其他程序的数据以及不是分配给他的主存区域。其次,一个程序出错不会破坏其他用户程序和系统程序。通过一些限制方式保护主存中程序的技术被称为存储保护。简单的说,存储保护就是对主存中的程序和数据进行保护。为了降低开销,在进行存储保护的时候,通常不会直接保护单个存储单元,而是以页或者段为单位进行保护。
基址寻址,将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。