三色旗问题java代码

合集下载

javase练习题

javase练习题

javase练习题一、基础知识篇1. Java基本数据类型有哪些?分别写出它们的默认值。

2. 什么是封装?简述封装的优点。

3. 请写出Java中的四种访问修饰符,并说明它们的访问权限。

4. 什么是构造方法?它与普通方法的区别是什么?5. 在Java中,如何实现方法的重载和重写?二、面向对象篇2. 如何实现一个简单的Java类,包含两个属性和一个方法?3. 简述Java中的继承机制及其作用。

4. 什么是接口?与抽象类有什么区别?5. 请举例说明Java中的多态性。

三、集合框架篇1. Java集合框架中常用的集合类有哪些?2. 请简述ArrayList和LinkedList的区别。

3. 什么是HashMap?它的工作原理是什么?4. 请解释HashSet和TreeSet的区别。

5. 如何遍历一个List集合?四、异常处理篇1. 什么是异常?Java中的异常分为哪几类?2. 请举例说明trycatchfinally语句的使用方法。

3. 什么是自定义异常?如何创建和使用自定义异常?4. 请简述Java异常处理机制的作用。

int a = 10;int b = 0;int result = a / b;五、IO流篇1. 请简述Java IO流的分类。

2. 如何实现文件复制功能?3. 请解释字节流和字符流的区别。

4. 什么是序列化和反序列化?如何实现?5. 请举例说明Java中的文件操作。

六、多线程篇1. 什么是线程?线程和进程有什么区别?2. 请简述线程的生命周期。

3. 如何创建一个线程?有哪几种方式?4. 什么是线程同步?为什么需要线程同步?5. 请解释线程池的概念及其作用。

七、网络编程篇1. 请简述TCP和UDP协议的区别。

2. 如何实现一个简单的Socket通信?3. 什么是URL?如何解析一个URL?4. 请简述HTTP协议的工作原理。

5. 如何实现一个简单的HTTP服务器?八、Java新特性篇1. 请列举Java 8中的几个新特性。

java中倒三角和正三角的代码

java中倒三角和正三角的代码

java中倒三角和正三角的代码在Java编程语言中,我们可以使用循环和条件语句来实现倒三角和正三角的输出。

下面,我们将详细介绍这两种图形的代码实现方法。

一、倒三角倒三角是指从上往下逐渐减少的一种图形。

我们可以使用嵌套循环来实现倒三角的输出。

代码如下:```public class InvertedTriangle {public static void main(String[] args) {int rows = 5;for (int i = rows; i >= 1; i--) {for (int j = 1; j <= i; j++) {System.out.print("* ");}System.out.println();}}}```运行以上代码,将输出如下倒三角形状:```* * * * ** * * ** * ** **```以上代码中,我们使用两个循环来控制行和列的输出。

外层循环控制行数,内层循环控制每行的列数。

通过逐渐减少的行数和逐渐增加的列数,实现了倒三角的输出。

二、正三角正三角是指从上往下逐渐增加的一种图形。

同样,我们可以使用嵌套循环来实现正三角的输出。

代码如下:```public class Triangle {public static void main(String[] args) {int rows = 5;for (int i = 1; i <= rows; i++) {for (int j = 1; j <= rows - i; j++) { System.out.print(" ");}for (int k = 1; k <= 2 * i - 1; k++) { System.out.print("*");}System.out.println();}}}```运行以上代码,将输出如下正三角形状:```*************************```以上代码中,我们同样使用两个循环来控制行和列的输出。

JVM垃圾回收之三色标记

JVM垃圾回收之三色标记

JVM垃圾回收之三⾊标记三⾊标记法是⼀种垃圾回收法,它可以让JVM不发⽣或仅短时间发⽣STW(Stop The World),从⽽达到清除JVM内存垃圾的⽬的。

JVM中的CMS、G1垃圾回收器所使⽤垃圾回收算法即为三⾊标记法。

三⾊标记算法思想三⾊标记法将对象的颜⾊分为了⿊、灰、⽩,三种颜⾊。

⽩⾊:该对象没有被标记过。

(对象垃圾)灰⾊:该对象已经被标记过了,但该对象下的属性没有全被标记完。

(GC需要从此对象中去寻找垃圾)⿊⾊:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。

(程序所需要的对象)算法流程从我们main⽅法的根对象(JVM中称为GC Root)开始沿着他们的对象向下查找,⽤⿊灰⽩的规则,标记出所有跟GC Root相连接的对象,扫描⼀遍结束后,⼀般需要进⾏⼀次短暂的STW(Stop The World),再次进⾏扫描,此时因为⿊⾊对象的属性都也已经被标记过了,所以只需找出灰⾊对象并顺着继续往下标记(且因为⼤部分的标记⼯作已经在第⼀次并发的时候发⽣了,所以灰⾊对象数量会很少,标记时间也会短很多), 此时程序继续执⾏,GC线程扫描所有的内存,找出扫描之后依旧被标记为⽩⾊的对象(垃圾),清除。

具体流程:⾸先创建三个集合:⽩、灰、⿊。

将所有对象放⼊⽩⾊集合中。

然后从根节点开始遍历所有对象(注意这⾥并不递归遍历),把遍历到的对象从⽩⾊集合放⼊灰⾊集合。

之后遍历灰⾊集合,将灰⾊对象引⽤的对象从⽩⾊集合放⼊灰⾊集合,之后将此灰⾊对象放⼊⿊⾊集合重复 4 直到灰⾊中⽆任何对象通过write-barrier检测对象有变化,重复以上操作收集所有⽩⾊对象(垃圾)三⾊标记存在问题浮动垃圾:并发标记的过程中,若⼀个已经被标记成⿊⾊或者灰⾊的对象,突然变成了垃圾,由于不会再对⿊⾊标记过的对象重新扫描,所以不会被发现,那么这个对象不是⽩⾊的但是不会被清除,重新标记也不能从GC Root中去找到,所以成为了浮动垃圾,浮动垃圾对系统的影响不⼤,留给下⼀次GC进⾏处理即可。

TZOJ挑战题库随机训练06

TZOJ挑战题库随机训练06

TZOJ挑战题库随机训练06点击题号跳转A.Java vs C++题意给⼀个字符串,问是C形式还是Java形式,不合法输出Error题解有点坑,需要注意'_'在开头和某尾,Java形式不能出现'_',C形式不能出现⼤写,不能出现连续两个'_',复杂度O(n)代码1 #include<bits/stdc++.h>2using namespace std;34int checkjava(string s){5if('A'<=s[0]&&s[0]<='Z')return false;6for(int i=0;s[i];i++){7if(s[i]=='_')return false;8 }9return true;10 }11int checkcpp(string s){12if(s[0]=='_')return false;13for(int i=0;s[i];i++){14if('A'<=s[i]&&s[i]<='Z')return false;15 }16for(int i=1;s[i];i++){17if(s[i]=='_'&&s[i-1]=='_')return false;18 }19if(s[s.size()-1]=='_')return false;20return true;21 }22int main(){23string s;24while(getline(cin,s)){25if(checkjava(s)){26for(int i=0;s[i];i++){27if('A'<=s[i]&&s[i]<='Z')cout<<"_"<<(char)(s[i]+32);28else cout<<s[i];29 }30 }else if(checkcpp(s)){31for(int i=0;s[i];i++){32if(s[i]=='_')continue;33if(i&&s[i-1]=='_')cout<<(char)(s[i]-32);34else cout<<s[i];35 }36 }else{37 cout<<"Error!";38 }39 cout<<'\n';40 }41return0;42 }AB.数据结构实验:压缩对称矩阵题意给⼀个对称矩阵,存⼀半,给定(i,j)输出题解存下半,如果i>j那么交换两个数,下标通过观察可以知道是⼀个等差+⼀个偏移量,计算得到i*(i-1)/2+j-1代码1 #include<bits/stdc++.h>2using namespace std;34void Zip(int a[100][100],int n,int b[]){5int i,j,index=0;6for(i=0;i<n;i++)7for(j=0;j<=i;j++)8 b[index++]=a[i][j];9 }10int Index(int i,int j){11if(i<j)swap(i,j);12//printf("i=%d j=%d index=%d\n",i,j,i*(i-1)/2+j-1);13return i*(i-1)/2+j-1;14 }BC.数据结构实验:⼆叉树倾斜度题意给⼀棵树,倾斜度就是每个节点左右⼉⼦⼦树和的差的绝对值题解⼀个dfs,dfs的同时再写两个dfs⽤于统计左右⼦树的和,由于N只有512,这样做也不会超时,复杂度O(n^2)代码1int lson(struct TreeNode* root){2int sum=0;3if(root->left!=NULL)sum+=root->left->val+lson(root->left);4if(root->right!=NULL)sum+=root->right->val+lson(root->right);5return sum;6 }7int rson(struct TreeNode* root){8int sum=0;9if(root->left!=NULL)sum+=root->left->val+rson(root->left);10if(root->right!=NULL)sum+=root->right->val+rson(root->right);11return sum;12 }13int findTilt(struct TreeNode* root){14int sum=0;15int lsum=(root->left!=NULL?root->left->val+lson(root->left):0);16int rsum=(root->right!=NULL?root->right->val+rson(root->right):0);17//printf("%d %d %d %d\n",root->val,lsum,rsum,sum);18 sum+=abs(rsum-lsum);19if(root->left!=NULL)sum+=findTilt(root->left);20if(root->right!=NULL)sum+=findTilt(root->right);21return sum;22 }CD.C++实验:栈类模板题意实现⼀个栈模板题解template<class T,int Size>class MyStack{private:public:}这个套路,也不是很难,注意这⾥top为空的时候,需要throw "Empty",复杂度O(1)代码1 #include<bits/stdc++.h>2using namespace std;34 template<class T,int SIZE>5class Stack {6int a[11],top;7public:8 Stack(){9 top=0;10 }11void Push(int x){12if(top==10)cout<<"Full\n";13else a[++top]=x;14 }15int Top(){16string s="Empty";17if(top==0) throw s;18else return a[top];19 }20void Pop(){21if(top==0)cout<<"Empty\n";22else top--;23 }24 };DE.Crosswords题意给6个长度为3的字符串,问是否可以选出3个使得,横竖出现的恰好是6个字符串题解模拟,暴⼒判断,复杂度O(6^4)代码1 #include<bits/stdc++.h>2using namespace std;34string sb[10],s[10];5 map<string,int>sma,smb;6bool check(){7 smb=sma;8string prep;9for(int i=0;i<3;i++){10if(smb[sb[i]]>0)smb[sb[i]]--;11else return0;12 prep=sb[0][i];prep+=sb[1][i];prep+=sb[2][i];13if(smb[prep]>0)smb[prep]--;14else return0;15 }16return1;17 }18int main(){19for(int i=0;i<6;i++)cin>>s[i],sma[s[i]]++;20int f[]={0,1,2,3,4,5};21for(int i=0;i<6;i++)22for(int j=0;j<6;j++)23for(int k=0;k<6;k++){24if(i!=j&&j!=k){25 sb[0]=s[i];26 sb[1]=s[j];27 sb[2]=s[k];28if(check()){29 cout<<sb[0]<<'\n'<<sb[1]<<'\n'<<sb[2]<<endl;30return0;31 }32 }33 }34 cout<<"0\n";35return0;36 }EF.Kannyi 的easy problem题意给个n,计算[1,n]中2^n-1有多少个能被7整除题解每左移三位可以被7整除,所以答案就是n/3,复杂度O(1)代码1 #include<bits/stdc++.h>2using namespace std;34#define LL long long5int main(){6 LL n;7while(scanf("%lld",&n)!=EOF,n){8 printf("%lld\n",n/3);9 }10return0;11 }FG.Modular Inverse题意ax同余1(mod p),给定a((0,1000]),p([0,1000])求出x题解很明显的exgcd,ax+by=gcd(a,b)构造ax+py=1,当gcd(a,p)不等于1时⽆解求出特解为x,由于要保证x>0,可以不断加上p/gcd(a,p),复杂度O(logn) PS:ax同余1(mod p)->ax%p=(py+1)%p->ax%p=py%p+1->ax+py同余1(mod p)(+和-⼀样)ax+by=c有解的条件是c%gcd(a,p)是否等于0那么上⾯有解的条件就是gcd(a,p)是否等于1代码1 #include<bits/stdc++.h>2using namespace std;3#define ll long long4 ll exgcd(ll a,ll b,ll &x,ll &y)5 {6if(b==0){x=1;y=0;return a;}7 ll r=exgcd(b,a%b,x,y);8 ll t=x;x=y;y=t-a/b*y;9return r;10 }11int main()12 {13int t;14 scanf("%d",&t);15while(t--)16 {17 ll a,p,x,y;18 scanf("%lld%lld",&a,&p);19 ll gc=exgcd(a,p,x,y);20if(gc!=1)printf("Not Exist\n");21else22 {23while(x<=0)x+=p/gc;24 printf("%lld\n",x);25 }26 }27return0;28 }H.桃⼦的可达数题意f[x]=x+1去掉末尾的0,问f[f[x]]循环会出现多少个不同的数题解模拟,存⼊unordered_map判重,复杂度O(100)代码1 #include<bits/stdc++.h>2using namespace std;34int main()5 {6int t;7 scanf("%d",&t);8while(t--){9int n;10 scanf("%d",&n);11 unordered_map<int,int>ma;12do{13if(ma.count(n))break;14 ma[n]=1;15 n++;16while(n!=0&&n%10==0)n/=10;17 }while(1);18 printf("%d\n",ma.size());19 }20return0;21 }Hgrange's Four-Square Theorem题意计算有多少个不超过4个平⽅数之和等于n([1,32768])题解可知182*182>32768,那么直接182^4+⼀些剪枝,复杂度O(14089082≈1.4e7)PS:dp[i][j]代表值为i,需要j个数的平⽅相加得到,转移dp[i][j+1]+=dp[i-val*val][j],复杂度O(15752792≈1.5e7),感谢zzl 代码1 #include<bits/stdc++.h>2using namespace std;34int n,dp[32768];5int main(){6for(int i=1;i<=182;i++){7 dp[i*i]++;8for(int j=i;j<=182;j++){9if(i*i+j*j>32768)break;10 dp[i*i+j*j]++;11for(int k=j;k<=182;k++){12if(i*i+j*j+k*k>32768)break;13 dp[i*i+j*j+k*k]++;14for(int l=k;l<=182;l++){15if(i*i+j*j+k*k+l*l>32768)break;16 dp[i*i+j*j+k*k+l*l]++;17 }18 }19 }20 }21while(scanf("%d",&n)!=EOF,n){22 printf("%d\n",dp[n]);23 }24return0;25 }1 #include <bits/stdc++.h>2#define ll long long3using namespace std;4const int N=1<<15;5int f[N+5][5];6int main() {7 f[0][0]=1;8for(int i=1;i<=182;i++) {9for(int j=i*i;j<=N;j++) {10for(int k=0;k<4;k++) {11 f[j][k+1]+=f[j-i*i][k];12 }13 }14 }15int n;16while(~scanf("%d",&n),n) {17 printf("%d\n",f[n][1]+f[n][2]+f[n][3]+f[n][4]);18 }19return0;20 }I by zzlJ.New Game题意n([1,100000])次操作,每次给⼀对数(a,b),a、b均⼩于等于100,问每次操作后,求出某个两两匹配,输出ai+bj最⼤值最⼩题解可以发现a、b很⼩,肯定从a、b下⼿,让ai+bj最⼩,那么肯定是ai最⼩的+bj最⼤的,ai第⼆⼩+bj第⼆⼤那么就可以通过pa指针和pb指针,每次都⽐较,复杂度O(100n)代码1 #include<bits/stdc++.h>2using namespace std;34int n,a[105],b[105],c[105],d[105];5int main(){6 scanf("%d",&n);7for(int i=1;i<=n;i++){8int x,y;9 scanf("%d%d",&x,&y);10 a[x]++;b[y]++;11for(int j=1;j<=100;j++)c[j]=a[j],d[j]=b[j];12int pa=1,pb=100,maxx=0;13while(pa<=100&&c[pa]==0)pa++;14while(pb>=1&&d[pb]==0)pb--;15while(pa<=100&&pb>=1){16if(c[pa]>d[pb])c[pa]-=d[pb],d[pb]=0;17else if(c[pa]<d[pb])d[pb]-=c[pa],c[pa]=0;18else c[pa]=d[pb]=0;19//printf("i=%d pa=%d pb=%d\n",i,pa,pb);20 maxx=max(maxx,pa+pb);21while(pa<=100&&c[pa]==0)pa++;22while(pb>=1&&d[pb]==0)pb--;23 }24 printf("%d\n",maxx);25 }26return0;27 }J。

leetcode 力扣 1920 判断国际象棋棋盘中一个格子的颜色 题解 算法题

leetcode 力扣 1920 判断国际象棋棋盘中一个格子的颜色  题解 算法题

题目:判断国际象棋棋盘中一个格子的颜色给你一个坐标coordinates,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。

下图是国际象棋棋盘示意图。

如果所给格子的颜色是白色,请你返回true,如果是黑色,请返回false。

给定坐标一定代表国际象棋棋盘上一个存在的格子。

坐标第一个字符是字母,第二个字符是数字。

示例 1:输入:coordinates = "a1"输出:false解释:如上图棋盘所示,"a1" 坐标的格子是黑色的,所以返回 false 。

示例 2:输入:coordinates = "h3"输出:true解释:如上图棋盘所示,"h3" 坐标的格子是白色的,所以返回 true 。

示例 3:输入:coordinates = "c7"输出:false提示:•coordinates.length == 2•'a' <= coordinates[0] <= 'h'•'1' <= coordinates[1] <= '8'语言:javaclass Solution {public boolean squareIsWhite(String coordinates) {int first = coordinates.charAt(0) - 'a';int second = coordinates.charAt(1) - '1';return (first + second) % 2 == 1;}}语言:javaclass Solution {public boolean squareIsWhite(String coordinates) {char z=coordinates.charAt(0);char s=coordinates.charAt(1);if((z-97+1)%2 !=0){if((s-48)%2 !=0){return false;}else{return true;}}else{if((s-48)%2 !=0){return true;}else{return false;}}}}语言:javaclass Solution {public boolean squareIsWhite(String s) {return ((s.charAt(0) - 'a' + 1) + (s.charAt(1) - '0')) % 2 == 1;}}语言:javascript/*** @param{string} coordinates* @return {boolean}*/var squareIsWhite =function(coordinates) {let x = coordinates[0].charCodeAt(0) -96;let y =+coordinates[1];if (x %2!==0) {return y %2===0;} else {return y %2!==0;}};语言:C++class Solution {public:bool squareIsWhite(string coordinates) {int a = coordinates[0] - 'a';int b = coordinates[1] - '1';return (a + b) % 2 == 1;}};语言:gofunc squareIsWhite1(coordinates string) bool {return (coordinates[1]-'0'+coordinates[0]-'a'+1)%2 != 0}语言:pythonclass Solution:def squareIsWhite(self, coordinates):s,n = coordinates# 这里使用if判断结果不为0,则表示True的方式,简化代码return True if (ord(s)+ int(n)) %2else False语言:phpclass S olution {/*** @param String $coordinates* @return Boolean*/function squareIsWhite($coordinates) {$key=str_split($coordinates);$key[0]=ord($key[0])-96;return(array_sum($key)%2==0)?false:true; }}。

java枚举带中文括号的代码

java枚举带中文括号的代码

枚举类型在Java中是一种特殊的类,它包含一组常量,这些常量通常代表一些特定的值。

在枚举中,我们通常会使用中文括号来表示枚举的值。

以下是一个简单的Java枚举示例,其中包含一些中文括号:```javapublic enum Color {RED("红色"), GREEN("绿色"), BLUE("蓝色");private final String displayName;Color(String displayName) {this.displayName = displayName;}public String getDisplayName() {return displayName;}}```这个枚举定义了三种颜色:红色、绿色和蓝色。

每种颜色都有其对应的中文名称。

使用时,可以根据需要访问枚举的值。

这是一个如何使用该枚举的例子:```javapublic class Main {public static void main(String[] args) {Color red = Color.RED;System.out.println(red.getDisplayName()); // 输出"红色"}}```在上述代码中,我们创建了一个Color枚举的实例red,并使用getDisplayName()方法获取其对应的中文名称。

关于这段代码的500-800字描述:首先,Java枚举是一种特殊的类,它包含一组固定的常量。

在Java中,我们通常使用中文括号来表示枚举的值,这在中文编程环境中非常有用,因为它可以帮助我们更清晰地表达我们的意图。

在这个例子中,我们定义了三种颜色:红色、绿色和蓝色,每种颜色都有其对应的中文名称。

这使得代码更易于阅读和理解。

其次,每个枚举常量都有一个私有字段和一个构造器。

这个字段通常用于存储枚举常量的实际值,而构造器则用于初始化这个字段。

打开练习题

打开练习题

一、选择题1. 下列哪个元素位于元素周期表的第二周期?A. 氢(H)B. 氧(O)C. 钠(Na)D. 铝(Al)2. 下列哪个国家的首都是伦敦?A. 法国B. 英国C. 德国D. 意大利3. 下列哪个国家的国旗上有三个平行横条?A. 日本B. 加拿大C. 澳大利亚D. 巴西4. 下列哪个国家的官方语言是西班牙语?A. 美国B. 墨西哥C. 巴西D. 阿根廷5. 下列哪个国家是联合国安全理事会的常任理事国?A. 法国B. 德国C. 日本D. 巴西二、填空题1. 人类历史上最早的文字记录出现在______。

2. 地球上最大的洲是______。

3. 下列哪个国家的首都是巴黎?______。

4. 下列哪个国家的货币是欧元?______。

5. 下列哪个国家的国旗上有三色旗?______。

三、判断题1. 氢气是自然界中最轻的气体。

()2. 氧气对人体呼吸至关重要。

()3. 亚洲是地球上人口最多的洲。

()4. 北极熊是北极地区的代表性动物。

()5. 互联网起源于美国。

()四、简答题1. 简述地球自转和公转的区别。

2. 简述太阳系中八大行星的顺序。

3. 简述欧盟的成立背景和目标。

4. 简述我国古代四大发明。

5. 简述全球变暖对人类的影响。

五、计算题1. 计算下列数的立方根:8、27、64。

2. 计算下列数的平方:4、9、16。

3. 计算下列数的倒数:2、3、5。

4. 计算下列数的和:7+8、9+10、11+12。

5. 计算下列数的差:158、149、1310。

六、应用题1. 一辆汽车以每小时60公里的速度行驶,3小时后到达目的地,求目的地距离出发地多少公里?2. 一个长方体的长、宽、高分别为5cm、3cm、2cm,求其体积。

3. 一个班级有男生25人,女生30人,求男生和女生人数的比例。

4. 一辆火车从甲地到乙地需要8小时,速度为每小时80公里,求甲地到乙地的距离。

5. 一个圆的半径为10cm,求其面积和周长。

Java 设计模式练习题及答案

Java 设计模式练习题及答案

Java 设计模式练习题及答案在学习Java设计模式时,练习题是非常重要的一部分。

通过练习题的实践,可以更好地理解和应用设计模式,提升自己的编程能力。

本文将介绍一些Java设计模式练习题,并提供相应的答案,希望能对读者在设计模式的学习和实践中有所帮助。

一、题目一:单例模式——懒汉式实现问题描述:请编写一个线程安全的懒汉式单例模式。

解答示例:```javapublic class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}```二、题目二:工厂模式——简单工厂实现问题描述:请使用简单工厂模式实现一个计算器,支持加减乘除四种运算。

解答示例:```javapublic class CalculatorFactory {public static Calculator createCalculator(String operator) {Calculator calculator = null;switch (operator) {case "+":calculator = new AddCalculator();break;case "-":calculator = new SubtractCalculator();break;case "*":calculator = new MultiplyCalculator();break;case "/":calculator = new DivideCalculator();break;}return calculator;}}public interface Calculator {double calculate(double num1, double num2);}public class AddCalculator implements Calculator {@Overridepublic double calculate(double num1, double num2) { return num1 + num2;}}public class SubtractCalculator implements Calculator { @Overridepublic double calculate(double num1, double num2) {return num1 - num2;}}// MultiplyCalculator和DivideCalculator类似,省略代码// 使用示例Calculator calculator = CalculatorFactory.createCalculator("+");double result = calculator.calculate(2, 3); // 结果为5```三、题目三:观察者模式问题描述:请设计一个简单的气象站系统,该系统需要实现以下功能:1. 可以添加观察者并实时更新气象数据;2. 当气象数据发生变化时,自动通知所有观察者进行更新。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(wFlag <= rFlag) {
if(color[wFlag] == WHITE){
wFlag++;
}
else if(color[wFlag] == BLUE) {
SWAP(bFlag, wFlag);
bFlag++;
wFlag++;
}
else {
while(wFlag < rFlag && color[rFlag] == RED){
//此处的color表示一根绳子上面不同颜色的小旗
public static void SWAP(int x,int y){ //这是交换彩旗的函数
char temp = color[x];
color[x] = color[y];
color[y] = temp;
}
public static void main(String[] args){
注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就都是红色了,此时就可以结束移动,如下所示:
package test;
//三色旗java代码
public class Gossip {
说明
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。
public static final char BLUE = 'b';
public static final char RED = 'r';
public static final char WHITE = 'w';
private static final char[] color = {'r', 'w', 'b', 'w', 'w', 'b', 'r', 'b', 'w', 'r'};
解法
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下所示:
只是要让移动次数最少的话,就要有些技巧:如果图中W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素。如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。
int bFlag = 0;
int wFlag = 0;
int rFlag = color.length-1;
for(int i=0;i<color.length;i++){
System.out.print(String.format("%c", color[i]));
}
System.out.println();
rFlag--;
}
SWAP(rFlag, wFlag);
rFlag--;
}
}
for(int i=0; i<color.length; i++){
System.out.print(String.format("%c", color[i]));
}
System.out.println();
}
}
相关文档
最新文档