21xrx.com
2024-11-25 03:09:12 Monday
登录
文章检索 我的文章 写文章
C++算法笔试题目
2023-07-01 04:40:17 深夜i     --     --
C++ 算法 笔试 题目 编程

C++是一种常见的编程语言,在很多算法笔试中都会用到。下面是几道C++算法笔试题目,供大家参考。

1. 两数之和

题目描述:给定一个整数数组nums和一个目标值target,求出数组中两个数的和为target的下标。

思路:可以使用一个哈希表来存储已经遍历的数及其下标,每次遍历到一个新数时,检查哈希表中是否有与之配对的数,有则返回当前数下标和哈希表中该数的下标,没有则将该数及其下标存入哈希表。

实现代码:

class Solution {

public:

  vector twoSum(vector & nums, int target) {

    unordered_map hash;

    for (int i = 0; i < nums.size(); i++) {

      int complement = target - nums[i];

      if (hash.count(complement)) {

        return vector {hash[complement], i};

      }

      hash[nums[i]] = i;

    }

    return vector ();

  }

};

2. 两两交换链表中的节点

题目描述:给定一个链表,交换其中两个相邻的节点,并返回交换后的链表。

思路:可以使用递归的方法,每次递归处理链表中的两个相邻节点,然后返回交换后的节点作为下一次递归的头节点。

实现代码:

class Solution {

public:

  ListNode* swapPairs(ListNode* head) {

    if (!head || !head->next)

      return head;

    ListNode* next = head->next;

    head->next = swapPairs(next->next);

    next->next = head;

    return next;

  }

};

3. 字符串相乘

题目描述:给定两个非负整数num1和num2,返回num1和num2的乘积。

思路:可以使用一个长度为m+n的数组res来存储两数相乘后的结果,每次遍历到num1中的一个数时,再遍历num2中的所有数,将对应位置上的数相乘并存入res中。最后再遍历一遍res,将其中的连续0去掉。

实现代码:

class Solution {

public:

  string multiply(string num1, string num2) {

    int m = num1.size(), n = num2.size();

    vector res(m+n, 0);

    for (int i = m-1; i >= 0; i--) {

      for (int j = n-1; j >= 0; j--) {

        int mul = (num1[i]-'0') * (num2[j]-'0');

        int p1 = i+j, p2 = i+j+1;

        int sum = mul + res[p2];

        res[p1] += sum / 10;

        res[p2] = sum % 10;

      }

    }

    string ans;

    for (int i = 0; i < res.size(); i++) {

      if (ans.empty() && res[i] == 0) continue;

      ans += res[i] + '0';

    }

    return ans.empty() ? "0" : ans;

  }

};

以上就是三道C++算法笔试题目的题意和思路,更详细的实现代码可以参考LeetCode官网上的题解。希望对大家有所帮助!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复