思路:最后结果只有两种情况,一种1010...,一种0101....,我们在原字符串中找出与这两种字符串不同的(需要反转)的字符串构成两个全新的字符串,然后开一个计数器,遍历新字符串,如果当前为0,则以0为底的字符串+1,若以1为底的字符串存在,则以1为底的字符串减1,反之同理,新字符串需改变的最小字符串个数为两者相加, 然后比较两个新字符串的的需改变的字符串大小即可。

代码:

#include<bits/stdc++.h>
using namespace std; 
int find(string s) {
       int end0=0,end1=0;
       if(s[0]=='0') end0++;
       else end1++;
       for(int i=1;i<s.size();i++) {
       	if(s[i]=='0') {
       		if(end1>0) {
       			end1--;
       			end0++;
			   } 
			else end0++;
		   }
		else {
			if(cnt0>0) {
				end0--;
				end1++;
			}
			else cend1++;
		}
	   }
    return end0+end1;
    }
void slove() {
	int n;cin>>n;
	string flag1,flag2;
	int flag=1;
	for(int i=0;i<n;i++) {
		if(flag==1) {
			flag1+='0';
			flag2+='1';
		}
		else {
			flag2+='0';
			flag1+='1';
		}
		flag*=-1;
	}
	string s;cin>>s;
	string cnt1,cnt2;

	for(int i=0;i<n;i++) {
		if(flag1[i]!=s[i]) cnt1+=s[i];
		if(flag2[i]!=s[i]) cnt2+=s[i];
	}

	cout<<min(find(cnt1),find(cnt2))<<endl;
}
int main() { 
	int t; cin>>t;
	while(t--) slove();
}