Advertisement

网易游戏研发笔试题记录2

阅读量:

网易有道笔试题(二)


文章目录

  • 网易有道笔试题(二)

  • 前言

  • 一、最多回文数

    • 1.问题描述
    • 2.解决方案
  • 二、组合幸运数字

    • 1.问题描述
    • 2.解决方案
  • 三、复习0-1背包问题

    • 1.问题描述
    • 2.解决方案
  • 总结


前言

准备面游戏研发岗位,特此对算法进行学习


一、最多回文数

1.问题描述

对于给定的一个字符串s,请问其中有多少个长度大于1且连续的子串是回文?回文即为正读和反读完全一致的文字序列(如"aa"、"aba"等)。

2.解决方案

复制代码
    #include<bits/stdc++.h>
    using namespace std;
    //算法复杂度O(n)
    int main()
    {
    char str[100001];
    int i,j,ans,len;
    ans = 0;
    cin >> str;
    len = strlen(str);
    for(i=1;i<len;i++){ //从第二个字符开始遍历
        //单轴
        for(j=1;j<len;j++){
            if(i-j>=0 && i+j<len && str[i-j]==str[i+j]){
                ans++;
            }else{
                break;
            }
        }
        //双轴
        for(j=0;j<len;j++){
            if(i-1-j>=0 && i+j<len && str[i-1-j]==str[i+j]){
                ans++;
            }else{
                break;
            }
        }
    }
    cout << ans << endl;
    return 0;
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

二、组合幸运数字

1.问题描述

小易将他的幸运数字设定为七,请你找出所有能被七整除的子集合,并计算这些子集合的最大总和。若无法找到符合条件的结果,则返回数值-1。

2.解决方案

复制代码
    #include<bits/stdc++.h>
    using namespace std;
    //  算法复杂度O(n)
    int main()
    {
    int arr[100001];
    int i,j,ans;
    i = j = 1;
    ans = 0;
    do
    {
        cin >> arr[i++];
    }while(cin.get() != '\n');	//输入回车结束
    // 模拟创建7个priority_queue(优先队列)按值的大小优先
    int arr1[i];    int i1;
    int arr2[i];    int i2;
    int arr3[i];    int i3;
    int arr4[i];    int i4;
    int arr5[i];    int i5;
    int arr6[i];    int i6;
    int arr7[i];    int i7;
    i1=i2=i3=i4=i5=i6=i7=1;
    sort(arr+1,arr+i);  //从小到大排序
    while(j<i)  //将所有数据依次放入桶中
    {
        if(arr[j]%7==0){
            arr7[i7++] = arr[j];
        }else if(arr[j]%7==1){
            arr1[i1++] = arr[j];
        }else if(arr[j]%7==2){
            arr2[i2++] = arr[j];
        }else if(arr[j]%7==3){
            arr3[i3++] = arr[j];
        }else if(arr[j]%7==4){
            arr4[i4++] = arr[j];
        }else if(arr[j]%7==5){
            arr5[i5++] = arr[j];
        }else if(arr[j]%7==6){
            arr6[i6++] = arr[j];
        }
        j++;
        //cout << arr[j++] << endl;
    }
    //从桶中取出合适的值 1--6 2--5 3--4 两两对应取出
    while(--i7>0){
        ans += arr7[i7];
    }
    while(--i6>0&&--i1>0){
        ans += (arr6[i6] + arr1[i1]);
    }
    while(--i5>0&&--i2>0){
        ans += (arr5[i5] + arr2[i2]);
    }
    while(--i4>0&&--i3>0){
        ans += (arr4[i4] + arr3[i3]);
    }
    if(ans == 0){
        cout << -1 << endl;
    }else{
        cout << ans << endl;
    }
    return 0;
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

三、复习0-1背包问题

1.问题描述

给定背包容量、物品重量与价值,选取有限容量内的最大价值的最优解

2.解决方案

复制代码
    #include<bits/stdc++.h>
    
    using namespace std;
    /*
    	0-1 背包问题(迭代版)
    	输入:
    		products_count:商品的数量
    		capacity:背包的容量
    		weight_array:商品重量数组
    		value_array:商品价格数组
    		result:结果数组
    */
    
    int knapsack(int products_count,int capacity,vector<int> &weights,vector<int> &values,vector<vector<int> > &res){
    	for(int i=1;i<=products_count;i++){//i个物品
    		for(int j=1;j<=capacity;j++){//背包容量为j
    			if(weights[i] > j){//当前背包的容量 j 放不下第 i 件商品时
    			    res[i][j] = res[i-1][j];
    			}else
    			{
    				res[i][j] = max( res[i-1][j-weights[i]] + values[i] , res[i-1][j]);
    			}
    		}
    	}
    
    	return res[products_count][capacity];
    }
    int main(){
    	int products_count,capacity;
    	int i,j;
    	cout << "please input products count and knapsack's capacity: " << endl; // 输入商品数量和背包容量
    	cin>>products_count>>capacity;
    	vector<int> weights(products_count + 1,0);
    	vector<int> values(products_count + 1,0);
    	cout << "please input weight array for " << products_count << " products" << endl;
    	for(int i=1;i<=products_count;i++)
    		cin>>weights[i];
    	cout << "please input value array for " << products_count << " products" << endl;
    	for(int i=1;i<=products_count;i++)
    		cin>>values[i];
    
    	vector<vector<int> > res(products_count + 1,vector<int> (capacity + 1,0));
    	knapsack(products_count,capacity,weights,values,res);
    	cout << "knapsack result is " << res[products_count][capacity] << endl;
    	for(j=0;j<=capacity;j++){
            cout << setw(4) << j << " ";
        }
        cout << endl;
    for(i=0;i<=products_count;i++){
        for(j=0;j<=capacity;j++){
            cout << setw(4) << res[i][j] << " ";
        }
        cout << endl;
    }
    	return 0;
    }
    
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

总结

在第二日投入算法学习中后不久, 我决定亲自实践一下, 结果发现自己对图论知识掌握不足, 同时动态规划问题也难以解决, 这让我深感困境. 记录下来, 并打算在明天继续深入研究这个问题, 经过反思总结后发现自己的基础较为薄弱, 尽管如此, 在实践中仍能有所收获和成长, 做出 couple 个相关程序后发现虽然过程曲折但最终还是取得了令人满意的成果! 最初的想法是采用暴力枚举的方法来解决问题, 但很快意识到这种方法的时间复杂度太高(O(n²)), 立即决定寻求更高效的解决方案——逐步优化到线性时间复杂度(O(n))的过程中充满了尝试与挑战, 即使经历了波折也感到非常有成就感!

全部评论 (0)

还没有任何评论哟~