C/C++每日一练(20230504) 数据流区间、冒泡排序、Pow(x,n)

简介: C/C++每日一练(20230504) 数据流区间、冒泡排序、Pow(x,n)

1. 将数据流变为多个不相交区间


给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。


实现 SummaryRanges 类:

  • SummaryRanges() 使用一个空数据流初始化对象。
  • void addNum(int val) 向数据流中加入整数 val
  • int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。

示例:

输入:
["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"]
[[], [1], [], [3], [], [7], [], [2], [], [6], []]
输出:
[null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]]
解释: 
SummaryRanges summaryRanges = new SummaryRanges(); 
summaryRanges.addNum(1); // arr = [1] 
summaryRanges.getIntervals(); // 返回 [[1, 1]] 
summaryRanges.addNum(3); // arr = [1, 3] 
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]] 
summaryRanges.addNum(7); // arr = [1, 3, 7] 
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]] 
summaryRanges.addNum(2); // arr = [1, 2, 3, 7] 
summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]] 
summaryRanges.addNum(6); // arr = [1, 2, 3, 6, 7] 
summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]


提示:

   0 <= val <= 10^4

   最多调用 addNum 和 getIntervals 方法 3 * 10^4 次

进阶:如果存在大量合并,并且与数据流的大小相比,不相交区间的数量很小,该怎么办?

出处:

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

代码:


#include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) != 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i < size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (size == 0)
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val - 1 == ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */
 string Vector2dToString(vector<vector<int>> vec2d, string sep = ",")
 {
     stringstream ss;
     ss << "[";
     for (int i = 0; i < vec2d.size(); ++i) {
         ss << "[";
         copy(vec2d[i].begin(), vec2d[i].end(), ostream_iterator<int>(ss, sep.c_str()));
    ss.seekp(-(int)sep.size(), ios_base::end);
         ss << "]" << sep;
     }
     ss.seekp(-(int)sep.size(), ios_base::end);
     ss << "]";
     return ss.str();
 }
int main()
{
  SummaryRanges summaryRanges;
  vector<vector<int>> res;
  summaryRanges.addNum(1);      // arr = [1]
  res = summaryRanges.getIntervals(); // 返回 [[1, 1]]
  cout << Vector2dToString(res, ", ") << endl;
  summaryRanges.addNum(3);      // arr = [1, 3]
  res = summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]]
  cout << Vector2dToString(res, ", ") << endl;
  summaryRanges.addNum(7);      // arr = [1, 3, 7]
  res = summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]]
  cout << Vector2dToString(res, ", ") << endl;
  summaryRanges.addNum(2);      // arr = [1, 2, 3, 7]
  res = summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]]
  cout << Vector2dToString(res, ", ") << endl;
  summaryRanges.addNum(6);      // arr = [1, 2, 3, 6, 7]
  res = summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]
  cout << Vector2dToString(res, ", ") << endl;
    return 0;
}



输出:

[[1, 1]]

[[1, 1], [3, 3]]

[[1, 1], [3, 3], [7, 7]]

[[1, 3], [7, 7]]

[[1, 3], [6, 7]]




2. 冒泡法排序大小


4286 3185 2895 3550 2745 按从小到大排序

出处:

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

代码:


#include <stdio.h>
#define ARR_LEN 255 
#define elemType int 
void bubbleSort (elemType arr[], int len) {
    elemType temp;
    int i, j;
    for (i=0; i<len-1; i++) 
        for (j=0; j<len-1-i; j++) { 
            if (arr[j] > arr[j+1]) { 
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
}
int main (void) {
    elemType arr[ARR_LEN] = {4286,3185,2895,3550,2745};
    int len = 5;
    int i;
    bubbleSort (arr, len);
    for (i=0; i<len; i++)
        printf ("%d\t", arr[i]);
    putchar ('\n');
    return 0;
}


输出:

2745    2895    3185    3550    4286




3. Pow(x, n)


实现 pow(x, n),即计算 x 的 n 次幂函数(即,xn)。


示例 1:

输入:x = 2.00000, n = 10

输出:1024.00000


示例 2:

输入:x = 2.10000, n = 3

输出:9.26100


示例 3:

输入:x = 2.00000, n = -2

输出:0.25000

解释:2-2 = 1/22 = 1/4 = 0.25


提示:

   -100.0 < x < 100.0

   -2^31 <= n <= 2^31-1

   -10^4 <= x^n <= 10^4

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

```c++

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    double myPow(double x, int n)
    {
        if (n == INT_MIN)
        {
            double t = dfs(x, -(n / 2));
            return 1 / t * 1 / t;
        }
        else
        {
            ___________________;
        }
    }
private:
    double dfs(double x, int n)
    {
        if (n == 0)
        {
            return 1;
        }
        else if (n == 1)
        {
            return x;
        }
        else
        {
            double t = dfs(x, n / 2);
            return (n % 2) ? (x * t * t) : (t * t);
        }
    }
};
```



出处:

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

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    double myPow(double x, int n)
    {
        if (n == INT_MIN)
        {
            double t = dfs(x, -(n / 2));
            return 1 / t * 1 / t;
        }
        else
        {
            return n < 0 ? 1 / dfs(x, -n) : dfs(x, n);
        }
    }
private:
    double dfs(double x, int n)
    {
        if (n == 0)
        {
            return 1;
        }
        else if (n == 1)
        {
            return x;
        }
        else
        {
            double t = dfs(x, n / 2);
            return (n % 2) ? (x * t * t) : (t * t);
        }
    }
};
int main (void) {
    Solution s;
    cout << s.myPow(2.0, 10) << endl;
    cout << s.myPow(2.1, 3) << endl;
    cout << s.myPow(2.0, -2) << endl;
    return 0;
}



输出:

1024

9.261

0.25


目录
相关文章
|
6月前
|
搜索推荐 C++
C++冒泡排序的实现
C++冒泡排序的实现
|
5月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
6月前
|
算法 C++
c++算法学习笔记 (12) 区间合并
c++算法学习笔记 (12) 区间合并
|
6月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
96 1
Linux 终端操作命令(1)
|
6月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
52 0
Linux 终端命令之文件浏览(4) head, tail
|
6月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
82 0
Linux 终端操作命令(3)内部命令用法
|
6月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
218 0
Linux系统部署Python语言开发运行环境
|
6月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
96 0
Go语言time库,时间和日期相关的操作方法
|
6月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
48 0
力扣C++|一题多解之数学题专场(2)
|
18天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4