【01串】
给定一个仅包含0或1的字符串,现在可以对其进行一种操作:
当有两个相邻的字符其中有一个是0另外一个是1的时候,可以消除掉这两个字符。
这样的操作可以一直进行下去直到找不到相邻的0和1为止。
问这个字符串经历了操作以后的最短长度。
输入描述: 第一行一个整数 n(1≤n二2:105),表示所给字符串长度。
第二行为所给字符串。
输出描述: 一个整数,表示问题的解。
备注: 示例1: 输入:4 1100 输出 0
public static void main(String[] args) {
String s="1100";
int len = s.length();
if(len<=1){
System.out.println(len);
}
Stack<Integer> stack =new Stack<>();
for(int i=0;i<len;i++){
char c = s.charAt(i);
if(!stack.isEmpty()){
Integer tmp = stack.pop();
if(tmp == c){
stack.push((int)c);
stack.push(tmp);
}
}else{
stack.push((int)c);
}
}
System.out.println( stack.size());
}
这个题其实可以更简单,一次遍历来汇总有多少0多少1,然后求绝对值
满二叉树求最小子树根节点
对于一棵满二叉排序树深度为K,节点数为 2^K - 1 ;节点值为 1至 (2^K-1)。
给出K和任意三个节点的值,输出包含该三个节点的最小子树的根节点值
样例输入:4 , 10 15 13 样例输出:12
这个题可以利用满二叉树的特性,不用构建二叉树,其实就是一个二分查找区间的过程:
K=4,则二叉树排列下来 1.2.3.4…15
根节点一定是 min=1 max=15 (min+max)/2 = 8
当前根节点的左节点为 min=1 max = 8 (min+max)/2 = 4
同理右节点为 min=8 max = 15 (min+max)/2 = 12
… 以此类推:
则对于一个集合判断最小根节点,就是从上到下依次看以某个节点为根节点的区间完美包含了待求集合的边界,同时它对应的层数最低,则这个节点就是最小根节点,代码如下:
public static void main(String[] args) {
int k = 4;
int[] nums = new int[]{10,15,13};
int min = 1;
int max =( 1<<k)-1;
int len = nums.length;
Arrays.sort(nums);
if(nums[0]<1||nums[len-1]>max){
return;
}
int dfs = k ;//树层
int currRoot = (min+max)/2;
int minNode = currRoot;
//print(root);
while(true){
if(nums[0]<=currRoot && nums[len-1]>=currRoot){
if(dfs<k){
minNode = currRoot;
k = dfs;
}
break;
}else{
if(nums[len-1]<currRoot){
max = currRoot-1;
}else if(nums[0]>currRoot){
min = currRoot+1;
}
currRoot = (min+max)/2;
dfs--;
}
}
System.out.println(minNode);
}