快手开发笔试编程题

快手开发编程:
数据范围很搞 。
 ll n,k;
ll a[maxn];

	string str;
void solveip4(){ 
	std::vector<int> v; int val = 0;
		for(int i = 0;i < sz(str);i++){ 
			if(str[i] == '.') {v.pb(val),val = 0; 
				if(i + 1 < sz(str) && str[i + 1] == '0' )  {
					wt("Neither");exit(0);}
			 } 
			else{  
				if(str[i] >= '0' || str[i] <= '9'){ 
					val *= 10;
					val += str[i] - '0';
				}else{ 
					wt("Neither");exit(0);
				}
			}
		}
		v.pb(val);
		if(v.size() != 4){ 
			wt("Neither");exit(0); 
		}  
		for(auto d:v){ 
			if(d <= 255 && d >= 0) {}
				else {
			wt("Neither");exit(0); }
		}
		wt("IPv4");
}
void solveip6(){ 
	string now = ""; 
	std::vector<string> v;
	for(int i = 0;i < sz(str);i++){  
		if(str[i] == ':'){  
			if(str[i + 1] == ':') {wt("Neither");exit(0);}
			v.pb(now);now = "";
		}else now += str[i]; 
	}
	v.pb(now); 
	if(sz(v) != 8) {wt("Neither");exit(0);}
	for(auto d:v){   	 
		if((int)d.size() > 4) {wt("Neither"); exit(0);}
		if(d == "0000"){wt("Neither");exit(0);}
		else if(d == "000"){wt("Neither");exit(0);}
		else if(d == "00"){wt("Neither");exit(0);}
	}
}
int main()
{ 
	ios;
	while(cin >> str){ 
		int val = 0;
		int flag1 = 0;
		int flag2 = 0;
		std::vector<int> v; 
		for(int i = 0;i < sz(str);i++){  
			if(str[i] == '.') flag1 = 1;
			else if(str[i] == ':') flag2 = 1;
		} 
		if(flag1 && flag2) {wt("Neither");continue;}
		if(flag1){ 
			solveip4();
		}else{  
			solveip6();
			wt("IPv6");
		} 
	}
    return 0;
}

set<string>s; 
string op[30] = {"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};  
string now = "";
string str;
void dfs(int cnt){ 
	if(cnt == sz(str)) { 
		s.insert(now);
		return ;
	}
	int x = str[cnt] - '1'; 
	for(int i = 0;i < op[x].size();i++){ 
		now += op[x][i]; 
		dfs(cnt + 1);
		now.pop_back();
	}
}
int main()
{ 
	ios; 
	while(cin >> str){ 
		for(int i = 0;i < sz(str);i++) 	dfs(0); 
			cout << "[";
			std::vector<string> v;
			for(auto d:s) v.pb(d);
			for(int i = 0;i < v.size() - 1;i++) cout << v[i] << ", ";
			cout << v.back();
			cout << "]"; 
	}
    return 0;
}
ll a[maxn];
int f[maxn];
int main()
{ 
	ios; 
	while(cin >> n){ 
		int sum = 0;
		fr1(i,1,n) cin >> a[i],sum += a[i]; 
		f[0] = 1;
		for(int i = 1;i <= n;i++){
			for(int j = sum;j >= 0;j--){ 
				if(j - a[i] >= 0 && f[j - a[i]]) f[j] = 1;
			}
		}
		int ans = INF;   
		for(int i = 1;i <= sum;i++) if(f[i]) 	ans = min(ans,abs(sum - i * 2)); 
		wt(ans);
	}
    return 0;
}

 ll n,k;
ll a[maxn]; 
int cnt[maxn];
int f[maxn];
int main()
{ 
	ios; 
	while(cin >> n){ 
		int ans = 0,Max= 0;
		fr1(i,1,n) cin >> a[i],cnt[a[i]]++,ans = max(ans,cnt[a[i]]); 
		sort(rg(a,1,n)); 
		for(int i = 1;i <= 2005;i++){  
			MS0(f);
			for(int j = 1;j <= 2020;j++){ 
				if(cnt[j]) { 
					f[j] = 1;
					if(j > i) f[j] += f[j - i],ans = max(ans,f[j]);
				}
			}
		}  
		wt(ans);
	}
    return 0;
}




#笔试题目##快手##题解##Java工程师#
全部评论
0 1 背包,相当于大小最接近sum/2的背包
点赞 回复 分享
发布于 2019-09-16 22:38
分数组的用贪心,AC了,忽略我代码中用的前缀和(刚开始以为是直接切数组,所以用了个前缀和,搞错了,但是那样也过了85%,迷~) private static void run3() { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); long[] num = new long[N + 1]; long[] preSum = new long[N + 1]; preSum[0] = 0; for (int i = 1; i <= N; ++i) { num[i] = scanner.nextLong(); preSum[i] = preSum[i - 1] + num[i]; } Arrays.sort(num); for (int i = 1; i <= N; ++i) preSum[i] = preSum[i - 1] + num[i]; long tmp1 = num[N]; long tmp2 = 0; for (int i = N - 1; i > 0; --i) { int t = i; while (i > 0 && tmp1 >= tmp2) { tmp2 += num[i]; --i; } while (i > 0 && tmp1 <= tmp2) { tmp1 += num[i]; --i; } if (t != i) i++; } System.out.println(Math.abs(tmp1 - tmp2)); // 下面的代码过了85% // long res = Long.MAX_VALUE; // for (int i = 1; i < N; ++i) { // res = Math.min(res, Math.abs(preSum[N] - preSum[i] - preSum[i])); // } // System.out.println(res); scanner.close(); }
点赞 回复 分享
发布于 2019-09-16 22:24
数据范围测出来,搞个完全背包跑一下就可以咯,
点赞 回复 分享
发布于 2019-09-16 22:33
大佬!请收下我的膝盖
点赞 回复 分享
发布于 2019-09-16 22:35
想了好久n=1000w的背包咋整,貌似有人2^n暴力都过了🤣
点赞 回复 分享
发布于 2019-09-16 22:41

相关推荐

1 4 评论
分享
牛客网
牛客企业服务