【2022】游卡校招技术岗笔试

1.[编程题]长度为 K 的重复字符子串

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。

数据范围: 2 进阶: 时间复杂度O(n),空间复杂度O(n)

输入例子1:

“createfunonyoka”,4

输出例子1:

4

输入例子2:

“yokagames”,3

输出例子2:

1

输入例子3:

“yoka”,4

输出例子3:

0

代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param k int整型 
     * @return int整型
     */
    int numKLenSubstrRepeats(string s, int k) {
        // write code here
        int left = 0,right = k-1;
        int ans = 0;
        int n = s.size();
        bool YN = false;
        while(right != n)
        {
            for(int i=left;i<=right;i++)
            {
                for(int j=i+1;j<=right;j++)
                {
                    if(s[i] == s[j])
                    {
                        ans++;
                        YN=true;
                        break;
                    }
                }
                if(YN)
                {
                    YN = false;
                    break;
                }
            }
            left++;
            right++;
        }
        return ans;
    }
};

2.[编程题]不重复的全排列

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

给定一个可包含重复数字的序列 nums ,按序列内字典升序返回所有不重复的全排列。
其中序列内字典升序指的是, 序列内从左到右的非降序排列,例如 nums=[1,2,3], 则因为[1,2,3] < [1,3,2], [3,1,2] < [3,2,1], [1,2,3]要先于[1,3,2]输出,[3,1,2]要先于[3,2,1]输出

输入例子1:

[3,3,4]

输出例子1:

[[3,3,4],[3,4,3],[4,3,3]]

输入例子2:

[1,10,-8]

输出例子2:

[[-8,1,10],[-8,10,1],[1,-8,10],[1,10,-8],[10,-8,1],[10,1,-8]]

代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型vector>
     */
    vector<vector<int>> ret;
    vector<int> cur;
    void backtrack(vector<int>& nums, vector<int>& visited, int loc) {
        int n = visited.size();
        if (loc >= n) {
            ret.emplace_back(cur);
            return;
        }
        for (int i = 0; i < n; ++i) {
            // if (i != 0 && nums[i] == nums[i - 1]) {
            //     continue;
            // }
            if (i > 0 && visited[i] == 0 && visited[i - 1] == 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            if (visited[i] == 0) {
                cur.emplace_back(nums[i]);
                visited[i] = 1;
                backtrack(nums, visited, loc + 1);
                cur.pop_back();
                visited[i] = 0;
            }
        }
    }
    vector<vector<int> > UniquePerm(vector<int>& nums) {
        // write code here
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<int> visited(n, 0);
        backtrack(nums, visited, 0);
        return ret;
    }
};

3.[编程题]合并两个有序链表

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

将两个降序链表合并为一个新的 降序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入例子1:

{6,3,2},{11,5,1}

输出例子1:

{11,6,5,3,2,1}

输入例子2:

{1},{}

输出例子2:

{1}

输入例子3:

{0},{0}

输出例子3:

{0,0}

代码:

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 *    ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param list1 ListNode类 
     * @param list2 ListNode类 
     * @return ListNode类
     */
    ListNode* MergeTwoLists(ListNode* l, ListNode* r) {
        // write code here
        auto dummy = new ListNode(0);
        auto temp = dummy;
        while (l && r) {
            if (l->val > r->val) {
                temp->next = l;
                l = l->next;
            } else {
                temp->next = r;
                r = r->next;
            }
            temp = temp->next;
        }
        temp->next = l ? l : r;
        return dummy->next;
    }
};

你可能感兴趣的:(c++,c++)