C/C++每日一练(20230406) 按要求求质数、两数之和、颜色分类

简介: C/C++每日一练(20230406) 按要求求质数、两数之和、颜色分类

1. 按要求求质数

求10-100之间个位数为7的质数

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <stdio.h>
int isp(int n)
{
    int i;
    if (n<2)
        return 0;
    for (i=2;i*i<=n;++i)
    {
        _______________;
    }
    return 1;
}
int main()
{
    int i=17;
    while (i<=100)
    {
        if (isp(i))
            printf("%d  ",i);
        i+=10;   
    }
    printf("\n");  
    return 0;
}
```

出处:

https://edu.csdn.net/practice/24851325

代码:

#include <stdio.h>
int isp(int n)
{
  int i;
  if (n<2)
    return 0;
  for (i=2;i*i<=n;++i)
  {
    if (n%i==0)
            return 0;
  }
  return 1;
}
int main()
{
  int i=17;
  while (i<=100)
  {
    if (isp(i))
      printf("%d  ",i);
    i+=10;   
  }
  printf("\n");  
  return 0;
}

输出:


2. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]


提示:

  • 2 <= nums.length <= 10^3
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只会存在一个有效答案

出处:

https://edu.csdn.net/practice/24851326

代码:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    vector<int> twoSum(vector<int> &nums, int target)
    {
        std::unordered_map<int, int> hset;
        vector<int> r;
        for (int i = 0; i < nums.size(); ++i)
        {
            int c = target - nums[i];
            auto iter = hset.find(c);
            if (iter != hset.end() && iter->second != i)
            {
                r.push_back(i);
                r.push_back(iter->second);
                return r;
            }
            hset.insert(std::make_pair(nums[i], i));
        }
        return r;
    }
};
void PrintArray(vector<int> arr)
{
    cout << "[";
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i];
        if (i < arr.size() - 1)
            cout << ",";
    }
    cout << "]" << endl;
}
int main()
{
  Solution s;
  vector<int> nums = {2,7,11,15};
  PrintArray(s.twoSum(nums, 9));
  nums = {3,2,4};
  PrintArray(s.twoSum(nums, 6));
  nums = {3,3};
  PrintArray(s.twoSum(nums, 6));
  return 0;
} 

输出:

[1,0]

[2,1]

[1,0]


3. 颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 012 分别表示红色、白色和蓝色。

示例 1:

输入:nums = [2,0,2,1,1,0]

输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]

输出:[0,1,2]

示例 3:

输入:nums = [0]

输出:[0]

示例 4:

输入:nums = [1]

输出:[1]


提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i]012

进阶:

  • 你可以不使用代码库中的排序函数来解决这道题吗?
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    void sortColors(vector<int> &nums)
    {
        int i = 0, j = nums.size() - 1;
        while (i < j)
        {
            if (nums[i] == 0)
            {
                i++;
                continue;
            }
            if (nums[j] != 0)
            {
                j--;
                continue;
            }
            swap(nums[i], nums[j]);
        }
        j = nums.size() - 1;
        while (i < j)
        {
            _____________________;
            swap(nums[i], nums[j]);
        }
    }
};
```

出处:

https://edu.csdn.net/practice/24851327

代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
class Solution
{
public:
  void sortColors(vector<int> &nums)
  {
    int i = 0, j = nums.size() - 1;
    while (i < j)
    {
      if (nums[i] == 0)
      {
        i++;
        continue;
      }
      if (nums[j] != 0)
      {
        j--;
        continue;
      }
      swap(nums[i], nums[j]);
    }
    j = nums.size() - 1;
    while (i < j)
    {
      if (nums[i] == 1)
      {
          i++;
          continue;
      }
      if (nums[j] != 1)
      {
          j--;
          continue;
      }
      swap(nums[i], nums[j]);
    }
  }
};
void PrintArray(vector<int> arr)
{
    cout << "[";
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i];
        if (i < arr.size() - 1)
            cout << ",";
    }
    cout << "]" << endl;
}
int main()
{
  Solution s;
  vector<int> nums = {2,0,2,1,1,0};
  s.sortColors(nums);
  PrintArray(nums);
  return 0;
} 

输出:

[0,0,1,1,2,2]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
3月前
|
存储 人工智能 C++
【C++】有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的 (源码)【独一无二】
【C++】有N种颜色的小球,开始同一种颜色小球装在同一个筐里面,颜色从1到N标号。有下面两个操作(Cab),把颜色是b的 (源码)【独一无二】
|
6月前
|
人工智能 算法 C++
c++算法学习笔记 (17) 质数
c++算法学习笔记 (17) 质数
|
6月前
|
存储 Java C++
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
37 1
|
6月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
97 1
Linux 终端操作命令(1)
|
6月前
|
存储 算法 C++
第 284 场周赛(C++ | 枚举 | 分类讨论 | 最短路 | 建反图)
【4月更文挑战第1天】- [LeetCode 6031](https://leetcode-cn.com/problems/find-all-k-distant-indices-in-an-array/):给定数组 `nums`、键值 `key` 和距离 `k`,找到所有与键值相等且与任意下标距离不超过 `k` 的下标,返回升序排序的列表。找到最小权重。
43 0
|
6月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
6月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
55 0
Linux 终端命令之文件浏览(4) head, tail
|
6月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
83 0
Linux 终端操作命令(3)内部命令用法
|
6月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
218 0
Linux系统部署Python语言开发运行环境
|
6月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
97 0
Go语言time库,时间和日期相关的操作方法