百度算法岗笔试-0329

投的是2022的暑期实习 计算机视觉算法研发工程师实习生
笔试编程两道题 全部AC
第一题:最长回文串01(leetcode : 5类似)
解题思路:中心扩展法求解最长回文串,分别以一个字符为中心和两个字符为中心,然后选择其中最长的那个
注意的点:这个题如果是 11111 or 000 返回0 所以有一个判断需要判断是否全为一样的值
代码:
#include <bits/stdc++.h>
using namespace std;
/*
1、回文串 判断
2、最长子串
3、双指针 中心扩展法 
找回文串的难点在于,回文串的的长度可能是奇数也可能是偶数,
解决该问题的核心是从中心向两端扩散的双指针技巧。
*/


// 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串
string palindrome(string &s, int l, int r) {
    // 防止索引越界 并且还要是回文  
    while (l >= 0 && r < s.length() && s[l] == s[r]) {
        // 双指针,向两边展开  
        l--; r++;
    }
    // 返回以 s[l] 和 s[r] 为中心的最长回文串
    // 这里要注意 l和r都是越界了的才会跳出while 所以 要把 l拉回界内 然后返回 r-l长度的子串 
    return s.substr(l+1, r-1-l);
    }

string longestPalindrome(string s) {
    string res = "";
    for (int i = 0; i < s.length(); i++) {
        // 以 s[i] 为中心的最长回文子串
        string s1 = palindrome(s, i, i);
        // 以 s[i] 和 s[i+1] 为中心的最长回文子串
        string s2 = palindrome(s, i, i + 1);
        // res = longest(res, s1, s2)
        res = res.length() > s1.length() ? res : s1;
        res = res.length() > s2.length() ? res : s2;
    }
    return res;
}
int main(){
	string s;
	string ans;
	cin>>s; //输入一个 字符串s
	map<char,int> mp; // 统计01出现的个数
	int len = s.size();
	for(int i=0; i<len; i++){
		mp[s[i]]++;
	}
    // 如果0/1出现的次数和字符串长度一样那就输出0 返回
	if(mp[s[0]]==len){
		cout<<0;
		return 0;
	}
	ans = longestPalindrome(s);
	cout<<ans<<endl;
	
	return 0;
} 
第二题:礼物组合 (原题原题原题 去年百度就考了)
礼物分为a,b两个品种。组合的方式包括两种,一种是组合里有x件a类礼物加y件b类礼物,一种是组合里有x件b类礼物加y件a类礼物。求组合数最多
输入abxy 分别表示a的数量b的数量x和y的值
解题思路:贪心 大的-大的 小的-小的 直到a或b的数量为0
#include <bits/stdc++.h>
using namespace std;

int main(){
 
    int a, b, x, y;
    cin >> a >> b >> x >> y;
 
	long long int ans=0;
	// 大-大 小-小 
	
	while(a && b){
		// a始终是大的 
		if(a<b){
			int temp = a;
			a = b;
			b = temp;
		}
		// x始终是大的 
		if(x<y){
			int temp = x;
			x = y;
			y = temp;
		}
		
		a = a-x;
		b = b-y;
		
		ans++; 
		
		 
	} 
	cout<<ans;
 
 
    return 0;
}


   

#百度笔试##实习##笔试题目#
全部评论
t2贴一个O(logn)解法: 显然,最大值为(a + b) // (x + y),下面对0到(a + b) // (x + y)二分check最大值max是否可以由max得到答案。 首先特判x=y的情况,max为min(a, b) // x。 设二分过程中的值为m,则可以由m得到答案(*)等价于存在m1使得m1*x+(m-m1)*y<=a 且 m1*y+(m-m1)*x<=b,分x>y和x<y讨论,解上面两个不等式得到m1的上界right和下界left,对right向下取整,对left向上取整,则(*)等价于left<=right 且left<=m且right>=0。 import math a, b, x, y = map(int,input().split(' &(5528)#39;)) if x == y:     print(min(a, b) // x) else:     l, r = 0, (a + b) // (x + y)     while  l <= r:         mid = (l + r ) // 2         if x > y:             left, right = (b - mid * x)/(y - x), (a - mid * y)/(x - y)         else:             right, left = (b - mid * x)/(y - x), (a - mid * y)/(x - y)         right, left = math.floor(right), math.ceil(left)         if left <= right and mid >= left and 0 <= right:             l = mid + 1         else:             r = mid - 1     print(r)
1 回复 分享
发布于 2022-03-29 22:35
百度编程题相对还简单一些
1 回复 分享
发布于 2022-03-29 21:09
老哥,方便透露一下算法岗笔试有什么题吗?需要怎么准备吗?
点赞 回复 分享
发布于 2022-04-09 20:38
贴一个自己的解法 nums = [int(i) for i in input().split()]         a = nums[0]         b = nums[1]         x = nums[2]         y = nums[3]         count = 0         while a >= 0 and b >= 0:             if a >= b:                 a, b = b, a              if x >= y:                 x, y = y, x              if b >= y and a >= x:                 b -= y                 a -= x                 count += 1             else:                 break         print(count)
点赞 回复 分享
发布于 2022-03-29 23:05
这数据也太弱了,t1 O(n^3)能过, t2 O(n)能过
点赞 回复 分享
发布于 2022-03-29 22:26
只A了第一道,第二道dp了半天过了9%😪
点赞 回复 分享
发布于 2022-03-29 21:39
第二题10**9能过?
点赞 回复 分享
发布于 2022-03-29 21:19
编程AC了,选择直接炸裂
点赞 回复 分享
发布于 2022-03-29 21:15
py超时了。好难过😓
点赞 回复 分享
发布于 2022-03-29 21:14
可是选择题也太难了……
点赞 回复 分享
发布于 2022-03-29 21:09
第二题可否当做线性规划整数解问题来做
点赞 回复 分享
发布于 2022-03-29 21:09
太强了,呜呜呜
点赞 回复 分享
发布于 2022-03-29 21:08

相关推荐

点赞 评论 收藏
分享
评论
5
21
分享

创作者周榜

更多
牛客网
牛客企业服务