百度10.15笔试

第一题,注意区分奇偶的情况就行,比如
n为4  k为2 此时ans为2 ,k为3时,ans还是为2
这里和奇数的情况不同,奇数超了n/2直接减去超过的数量即可

第二题,找规律可以看出来,第一次操作可以确定第一个字符,第2 ,3次操作可以确定第2  ,3个字符,所以直接用链表就行,代码具体核心为

        ListNode last = pre;
        pre = dummy;
        for (int i = 1; i < s.length(); i ++) {     // 注意这里不能使用<=  因为最后一步 cur 会为null
            ListNode cur = pre.next;
            pre.next = cur.next;
            pre = pre.next;
            last.next = cur;
            last = cur;
            cur.next = null;
        }

第三题,一共13种情况,每一种情况自己都手算一次,,算出来一个对一个案例,至少1,2,3都是0;哈哈哈哈
全部评论

相关推荐

百度麻将第二题,这样做有问题吗?public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        // 注意 hasNext 和 hasNextLine 的区别        while (in.hasNext()) { // 注意 while 处理多个 case            String str = in.nextLine();            System.out.println(rotateStr(str));        }    }    public static String rotateStr(String str) {        char[] charArray = str.toCharArray();        Boolean[] bs = new Boolean[charArray.length];        Arrays.fill(bs, false);        int g = 2;        LinkedList<Character> list = new LinkedList<>();        for (int i = 1; i < bs.length; i+=2) {            list.add(charArray[i]);            bs[i] = true;        }        while (list.size() != charArray.length) {            g = 2 * g;            int start = 0;            for (int i = 0; i < bs.length; i++) {                if (!bs[i]){                    start = i;                    break;                }            }            for (int i = start; i < charArray.length; i+=g) {                list.add(charArray[i]);                bs[i] = true;            }        }        StringBuilder sb = new StringBuilder();        for (Character c : list) {            sb.append(c);        }        return sb.toString();    }}
投递百度等公司10个岗位
点赞 评论 收藏
分享
10-15 21:11
厦门大学 Java
百度麻将笔试 10.15 题解后端卷第一题 贪心n选k 如果选择的数的下一个数没被选,积分+1所以最后一个数一定能拿一分,而在 n/2的转折处1 (2) 3 (4) 5 (6)(n = 6, k = 3) 可以拿三分k = 4 时(1) (2) 3 (4) 5 (6) 仍然可以拿三分,也就是选择了这个1 不会得分但也不会丢分然后注意数字范围取long long while(t --){        long long int n;        long long int k;        cin>>n>>k;        //n个数里最多可以得n/2 ……        //1 - n里假如 n 是奇数 1,2,3可以选2两个数        //假如是偶数那可以选        long long int res = 0;        if(n % 2 == 1) res = n/2 + 1;        else res = n/2;        //到这里是最多能拿多少分,之后每选一个还得扣        if(k <= res) cout<<k<<endl;        else{            long long int tmp = n + 1;            cout<<tmp - k << endl;        }    }第二题 约瑟夫环问题注意到每一次选择一个数,都能确定下来结果的一位数比如 1 2 3 4第一次1到队尾,我们就能确定2是结果里的第一位,并且每一次都能确定下来一位所以本质是约瑟夫环问题代码就不放了,我是用队列模拟的第三题 麻将想了半天dp想不出来,那就搜索一下试试,刚好过了——————//dp想破头想不出来//试一下搜索//广度优先搜索//每一轮找刻子或者顺子//然后四轮后找雀头//找得到就res ++//数据量应该支持//哈希表记录一下stringunordered_set<string> uset;void dfs(vector<int> &v,int round){    if(round == 4){        for(int i = 0;i<v.size();i++){            if(v[i] >= 2){                v[i] -=2;                string tmp;                for(int j = 0;j < v.size();j++){                    tmp.push_back(v[j] + '0');                    tmp.push_back(j + '0');                }                v[i] += 2;                uset.insert(tmp);            }        }        return;    }    //dfs    //先搜刻子,再搜顺子    for(int i = 0;i<v.size();i++){        if(v[i] >= 3){            v[i] -= 3;            dfs(v, round + 1);            v[i] += 3;        }    }    for(int i = 1;i < v.size()-1;i++){        if(v[i-1] >= 1 && v[i] >= 1 && v[i + 1] >= 1){            v[i - 1] --;            v[i] --;            v[i + 1] --;            dfs(v,round + 1);            v[i - 1] ++;            v[i] ++;            v[i + 1] ++;        }    }}int main() {    int n;    cin>>n;    if(n <= 3) cout<<0;    else{        vector<int> vo(n);        fill(vo.begin(),vo.end(),4);        dfs(vo, 0);        cout<<uset.size()<<endl;    }    }
投递百度等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务