LeetCode双周赛73(Cpp+Golang)

题意:

给定一个数组,要求找出所有在key之后出现的数字当中,频数最高的那个数

思路:

用一个map保存出现次数,遍历一遍之后返回结果

代码(Cpp):

class Solution {
public:
    int mostFrequent(vector<int>& nums, int key) {
        map<int,int>mp;
        int id=0,maxx=0;
        for(int i=1;i<nums.size();i++){
            if (nums[i-1]==key){
                mp[nums[i]]++;
                if(mp[nums[i]]>maxx){
                    maxx=mp[nums[i]];
                    id=nums[i];
                        
                }
                
            }
        }
        return id;
    }
};

题意:

给定一个数组和一个映射规则,要求将数组中的数字转换为映射之后的数字,进行排序,根据映射值的大小排序原数组的值,要求是一个稳定的排序,即相同映射值的数据相对位置不变。

思路:

直接模拟,转换成字符串,根据映射替换,求出映射值,然后排序,用一个结构体保存原数据、映射值、原位置。

代码(Cpp):

struct node{
    int val,id,org;
    bool operator<(node b){
        if (val==b.val)return id<b.id;
        return val<b.val;
    }
};

class Solution {
public:
    vector<int> sortJumbled(vector<int>& mapping, vector<int>& nums) {
        vector<node>p(nums.size());
        int n=nums.size();
        for(int i=0;i<n;i++){
            stringstream ss;
            string s;
            ss<<nums[i];
            ss>>s;
            int r=0;
            for(int i=0;i<s.size();i++){
                r=r*10+mapping[s[i]-0];
            }
            p[i].val=r,p[i].id=i,p[i].org=nums[i];
        }
        
        sort(p.begin(),p.end());
        for(int i=0;i<n;i++){
            nums[i]=p[i].org;
        }
        return nums;
    }
};

题意:

给定一个有向无环图,要求找出该节点的所有祖先。

思路:

利用 bitset 进行化简运算,对于条有向边,用a[i] |= a[k] 表示将 k 的所有父节点赋值到 i 结点上,最后根据操作结果将所有节点的祖先保存为二维数组并返回。

代码author:

代码(Cpp):

class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& e) {
        bitset<1000> a[1000];
        for (int i = 0; i < e.size(); i++)
        {
            a[e[i][0]][e[i][1]] = 1;
        }
        for (int k = 0; k < n; k++)
        {
            for (int i = 0; i < n; i++)
            {
                if (a[i][k])
                {
                    a[i] |= a[k];
                }
            }
        }
        vector<vector<int> > z;
        for (int i = 0; i < n; i++)
        {
            vector<int> b;
            for (int j = 0; j < n; j++)
            {
                if (a[j][i])
                {
                    b.push_back(j);
                }
            }
            z.push_back(b);
        }
        return z;
    }
};

题意:

给定一个字符串,每次操作是交换相邻的两个字符,要求用最少的次数使得该字符串变成回文串。

思路一:

贪心。没做出来,根据

每次将第一个字符固定,从末端寻找相同字符,移到当前状态的末端。下一次从前端第二个字符开始,重复该算法。以此将问题分割成一系列子问题。如果找不到,就要将当前首字符移动到字符串的中间位置。

代码一(Golang):

func minMovesToMakePalindrome(s string) int {
    n,ans:=len(s),0
    sb:=make([]byte,n)
    for i:=range s{
        sb[i]=s[i]
    }
    for i,j:=0,n-1;i<j;i++{
        for k:=j;i!=k;k--{
            if sb[i]==sb[k]{
                for ;k<j;k++{
                    sb[k],sb[k+1]=sb[k+1],sb[k]
                    ans++
                }
            }
        }
        ans+=n-i+1
        
    }
}

思路二:

根据。将问题转换为一个逆序对问题,用树状数组求解。

经验分享 程序员 微信小程序 职场和发展