2016腾讯研发工程师编程题

题目一

题目一
2016腾讯研发工程师编程题_第1张图片
分析

规律:n+1位是n位格雷码个数的一倍。
n+1位的获得是0+正向n位格雷码 1+倒序列遍历n位格雷码
思路:按照以上规律递归直到得到n位格雷码

import java.util.*;

public class GrayCode {
    ArrayList<StringBuffer> result = new ArrayList<StringBuffer>();
    public String[] getGray(int n) {
        //先加入第一位
        result.add(new StringBuffer("0"));
        result.add(new StringBuffer("1"));
        getGrayHelper(1, n);
        String[] str = new String[result.size()];
        for(int i=0;i<result.size();i++){
            str[i] = result.get(i).toString();
        }
        return str;
    }
    public void getGrayHelper(int index,int n){
        if(index==n){
            return ;
        }
        //正序首位添加0
        for(int i=0;i<result.size();i++){
            result.get(i).insert(0, '0');
        }
        //逆序搜索 新建复制 首位更改为1
        for(int i=result.size()-1;i>=0;i--){
            StringBuffer temp = new StringBuffer(result.get(i));
            temp.setCharAt(0, '1');
            result.add(temp);
        }
        getGrayHelper(index+1, n);
    }
}

题目二

2016腾讯研发工程师编程题_第2张图片
分析:这道题对应另一道题,在数组中找出超过数组长度一半的数。
思路
1. 用栈存储如果栈空或者和栈顶元素相同则进栈
2. 最后得到一个元素作为拟得到的结果
3. 把2的结果在数组中统计出现的个数,如果超过一半那么返回它反之返回-1

import java.util.*;

public class Gift {
    public int getValue(int[] gifts, int n) {
        // write code here
        Stack<Integer> stack = new Stack<Integer>();
        for(int i=0;i<n;i++){
            if(stack.isEmpty() || gifts[i] == stack.peek()){
                stack.push(gifts[i]);
            }else{
                stack.pop();
            }
        }
        if(stack.isEmpty()){
            return 0;
        }
        int result = stack.peek();
        int count =0;
        for(int i=0;i<n;i++){
            if(gifts[i]==result) count++;
        }
        if(count>n/2 )
        return stack.pop();
        return 0;
    }
}
添加笔记

你可能感兴趣的:(2016腾讯研发工程师编程题)