タイトル説明
2つのバイナリ文字列を指定し、それらの合計を(バイナリ表現で)返します。
入力は 空でない 文字列であり、数字1
と 0
。のみが含まれます 。
アイデア
- aは長い文字列を表すために使用され、bは他の文字列を表します
- aを文字配列ch1に変換し、bを文字配列ch2に変換します
バックからフロントに文字列CH1とCH2を横切る。のでCH2がCH1の前に横断することができる、定義する必要があり、一時的な文字。①IfCH2がトラバースされていない場合、CH2の文字が②IfCH2がトラバースされる一時的な文字に格納されています、その後、「0」が一時文字に格納されます
- キャリーを意味する文字を定義します。初期値は「0」です。
- のch1に保存された予備結果
状況①キャリーは「0」
- ch1の文字== '1'およびch2の文字== '1'次に、ch1の文字を '0'に変更し、キャリーを '1'に変更します。
- ch1の文字== '0'およびch2の文字== '1'次に、ch1の文字を '1'に変更します。
ケース②キャリーは「1」
- ch1の文字== '0'およびch2の文字== '0'次に、ch1の文字を '1'に変更し、キャリーを '0'に変更します。
- ch1 == '1'の文字とch2 == '1'の文字、続行
- ch1またはch2の文字が「1」の場合、ch1の文字は「0」に変更されます。
すべてのトラバーサルが完了すると、新しいStringBufferオブジェクトが最終的な計算結果を格納するために使用されます。①キャリーが「1」でその内容が「1」の場合、ch1の要素は順番にスプライスされます。②キャリーが'1'ではなく、ch1の要素を直接接続するだけです
コード
class Solution {
public String addBinary(String a, String b) {
if(a.length()<b.length()){
String tem=a;
a=b;
b=tem;
}
char[] ch1=new char[a.length()];
char[] ch2=new char[b.length()];
for(int i=0;i<ch1.length;i++){
ch1[i]=a.charAt(i);
}
for(int i=0;i<ch2.length;i++){
ch2[i]=b.charAt(i);
}
int i=ch1.length-1;
int j=ch2.length-1;
char char2='0';
char tem='0';
for(;i>=0;i--){
char2='0';
if(j>=0){
char2=ch2[j];
}
if(tem=='0'){
if(ch1[i]=='1'&&char2=='1'){
ch1[i]='0';
tem='1';
}else if(ch1[i]=='0'&&char2=='1'){
ch1[i]='1';
}
}else if(tem=='1'){
if(ch1[i]=='0'&&char2=='0'){
ch1[i]='1';
tem='0';
}else if(ch1[i]=='1'&&char2=='1'){
j--;
continue;
}else if(ch1[i]=='1'||char2=='1'){
ch1[i]='0';
}
}
j--;
}
StringBuffer re=new StringBuffer();
if(tem=='1'){
re.append('1');
}
for(int d=0;d<ch1.length;d++){
re.append(ch1[d]);
}
return re.toString();
}
}