1. 双指针 寻找 最长连续 0 的写法 :
[ last, i ) 为每次的判断区间
last = 0;
for( int i = 0;i < len;i++ ){
if( a[i] == 0 ) continue;
last = i+1;
}
2.进制转换的方法
#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
char ans[9][5];
int bg[9];
char F( int x ){
if( x <= 9 ) return '0'+x;
return 'a'+x-10;
}
void change(char* s){
int c = 0;
for( int i = 0;i < 16;i++ ){
c += (s[i] == '1') << (16-i-1);
}
for( int i = 1;i <= 4;i++ ){
ans[cnt][i] = F(c%16);
c /= 16;
}
int i = 4;
while( i >= 1 && ans[cnt][i] == '0' )i--;
bg[cnt] = i;
cnt++;
}
int main(){
int T;
scanf("%d",&T);
for( int tt = 1;tt <= T;tt++ ) {
printf("Case #%d: ", tt);
memset(bg, 0, sizeof(bg));
char str[129];
cnt = 0;
scanf("%s", str);
for (int i = 0; i < 128; i += 16) {
change(str + i);
}
int last = 0, len = 2, l = -1, r = -1;
bg[8] = 1;
for (int i = 0; i <= 8; i++) {
if (bg[i] == 0) continue;
if (i - last >= 2) {
int cur;
if (last == 0 || i == 8) {
cur = (i - last) * 2 - 2;
} else {
cur = (i - last) * 2 - 1;
}
if (cur >= len ) {
l = last;
r = i - 1;
len = cur;
}
}
last = i + 1;
}
for (int i = 0; i < 8; i++) {
if (i == l) printf("::");
if (i >= l && i <= r) continue;
for (int j = bg[i]; j >= 1; j--) {
printf("%c", ans[i][j]);
}
if (bg[i] == 0) printf("0");
if (i != l - 1 && i != 7) printf(":");
}
cout << endl;
}
return 0;
}