コンテンツ
1.代替の追加
①タイトルと例:
②方法分析:
質問の意味から、非演算子を使用して演算を完了したいことがわかり、ビット演算子を使用して計算することも簡単に考えられます。
そして、計算する前に知っておく必要があるのは、次のとおりです。
a。2進ビットのXOR演算の結果は、(キャリーケースを考慮せずに)2つの数値の対応する加算の結果です。
b。ビット単位および1ビット左シフトの結果は、2つの数値のキャリーの結果です(キャリーケースのみが考慮されます)
したがって、上記の結論に基づいて、理解を組み合わせるために次の図を作成できます。
③コードは以下の通りです。
import java.util.*; public class UnusualAdd { public int addAB(int A, int B) { // write code here if(B==0){//要是B为0,则不需要进位,直接可以返回A的值 return A; } int sum=0; int tmp=0; while(B!=0){//即需要进位的时候 sum=A^B;//将两数相加(不判断进位) tmp=(A&B)<<1;//判断进几位 A=sum; B=tmp; }//出循环后,然后B=0了,即不需要进位,此时的和就是A的值 return A; } }
2.パスワード強度レベル
①トピックの例:
コードは次のとおりです:(この質問はそれほど難しいことではありませんが、もっと面倒なので、コードを直接添付してください)
import java.util.*; public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNextLine()){ String str=sc.nextLine(); int sum1=getLen(str); int sum2=getChar(str); int sum3=getNum(str); int sum4=getSym(str); int sum=0; if(sum2==20&&sum3>=1&&sum4>=1){ sum=sum1+sum2+sum3+sum4+5; }else if(sum2==10&&sum3>=1&&sum4>=1){ sum=sum1+sum2+sum3+sum4+3; }else if(sum2==10&&sum3>=1&&sum4==0){ sum=sum1+sum2+sum3+sum4+2; }else{ sum=sum1+sum2+sum3+sum4; }if(sum>=90){ System.out.println("VERY_SECURE"); }else if(sum>=80){ System.out.println("SECURE"); }else if(sum>=70){ System.out.println("VERY_STRONG"); }else if(sum>=60){ System.out.println("STRONG"); }else if(sum>=50){ System.out.println("AVERAGE"); }else if(sum>=25){ System.out.println("WEAK"); }else if(sum>=0){ System.out.println("VERY_WEAK"); } } }public static int getLen(String str){ if(str.length()<=4){ return 5; }else if(7>=str.length()&&str.length()>=5){ return 10; }else if(str.length()>=8){ return 25; }return 0; }public static int getChar(String str){ int small=0; int big=0; for(int i=0;i<str.length();i++){ if(str.charAt(i)>=65&&str.charAt(i)<=90){ big++; }else if(str.charAt(i)>=97&&str.charAt(i)<=122){ small++; } }if(small>0&&big>0){ return 20; }else if(small>0||big>0){ return 10; }else{ return 0; } }public static int getNum(String str){ int num=0; for(int i=0;i<str.length();i++){ if(str.charAt(i)-'0'>=0 && str.charAt(i)-'0'<=9){ num++; } }if(num>1){ return 20; }else if(num==1){ return 10; }else{ return 0; } }public static int getSym(String str){ int num=0; for(int i=0;i<str.length();i++){ if(!(str.charAt(i)>=65&&str.charAt(i)<=90)&& !(str.charAt(i)>=97&&str.charAt(i)<=122)&& !(str.charAt(i)-'0'>=0&&str.charAt(i)-'0'<=9)){ num++; } }if(num>1){ return 25; }else if(num==1){ return 10; }else{ return 0; } } }
3.最新の共通祖先
①タイトルと例:
②方法分析:
タイトルの意味から、同時に、子ノードとその親ノードの対応関係を明確に知ることができます。
その親ノード=左サブツリーノード/2=右サブツリーノード/2;
このようにして、子ノードの親ノードを何度も見つけることができ、最後に、2つのサブツリーが等しい場合、それが最も近い共通の祖先であると見なすことができます。以下は図解です。
③コードは以下の通りです。
import java.util.*; public class LCA { public int getLCA(int a, int b) { // write code here while(a!=b){ if(a>b){ a/=2; }else{ b/=2; } } return a; } }
4.最大ビット数を見つけます
①タイトルと例:
②方法分析:
質問の意味は簡単に理解できますが、1の数は毎回異なる可能性があり、数が不確かであるため、2つの変数を定義し、それらの間の最大値を比較して、必須。同時に、1の数をどのように判断するかという質問があります。ここでは、&on 1を使用して最後の桁を判断します。1の場合はcount++、1でない場合はcount = 0です。判断サイクルが成功するたびに、値>>1を右に1つシフトします。次の判断ができるように、最後のビットを置き換えます。
③コードは以下の通りです。
import java.util.*; public class Main{ public static void main(String[]args){ Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); int count=0; int tmp=0; while(n!=0){ if((n&1)==1){ count++; tmp=Math.max(count,tmp); }else{ count=0; } n>>=1; } System.out.println(tmp); } }