三色旗问题java代码
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编程语言中,我们可以使用循环和条件语句来实现倒三角和正三角的输出。
下面,我们将详细介绍这两种图形的代码实现方法。
一、倒三角倒三角是指从上往下逐渐减少的一种图形。
我们可以使用嵌套循环来实现倒三角的输出。
代码如下:```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不发⽣或仅短时间发⽣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点击题号跳转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 判断国际象棋棋盘中一个格子的颜色 题解 算法题

题目:判断国际象棋棋盘中一个格子的颜色给你一个坐标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枚举示例,其中包含一些中文括号:```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设计模式练习题,并提供相应的答案,希望能对读者在设计模式的学习和实践中有所帮助。
一、题目一:单例模式——懒汉式实现问题描述:请编写一个线程安全的懒汉式单例模式。
解答示例:```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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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();
}
}