【C++复习】经典笔试题

文章目录

  • 八大排序
    • 快排过程
  • 卡特兰数
  • 反转链表
  • 链表的回文结构
  • 左叶子之和
  • 另一棵树的子树
  • 归并排序
  • 类与对象
  • 编程训练
    • 杨辉三角
    • 字符串乘积
    • 二叉树前序遍历成字符串
    • 数组的交集
    • 二叉树的非递归前序遍历
    • 连续子数组的最大乘积

八大排序

插冒归稳定

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

快排过程

以 [3,4,6,1,2,4,7] 为例,以第一个元素3为base,定义左右两个指针(小熊l,小熊r),分别从两端开始扫描。从右向左找比3小的数,替换l所在位置的元素。再从左往右找比3大的数,然后替换r所在位置的元素。重复此过程直至两个小熊重合(两个指针指向同一元素),base替换此元素,此时第一轮结束。再递归排序base左右两部分的元素。

卡特兰数

在这里插入图片描述

C0 = 1,         
C1 = 1,         C2 = 2,          C3 = 5,          C4 = 14,          C5 = 42,
C6 = 132,       C7 = 429,        C8 = 1430,       C9 = 4862,        C10 = 16796,
C11 = 58786,    C12 = 208012,    C13 = 742900,    C14 = 2674440,    C15 = 9694845,
C16 = 35357670, C17 = 129644790, C18 = 477638700, C19 = 1767263190, C20 = 6564120420, ...

反转链表

💡 采用翻指针法,将每个节点的next指针翻转一下,让其指向前一个节点即可

struct ListNode* ReverseList(struct ListNode* head )
{struct ListNode* prev=NULL;//prev指针初始为为NULL,考虑链表本身为空的情况struct ListNode* cur=head;while(cur){struct ListNode* next=cur->next;//先保存下一个节点,防止下面翻指针过程中丢失next节点cur->next=prev;prev=cur;cur=next;}return prev;//prev最终指向原链表最后一个节点,即翻转后的第一个节点
}

💡 头插法,遍历原链表每个节点,将其头插到初始为NULL的新链表上即可

struct ListNode* ReverseList(struct ListNode* head )
{struct ListNode* cur=NULL;//cur指针初始化为NULL,考虑链表本身为空的情况while(head){struct ListNode* next=head->next;//先保存下一个节点,防止下面翻指针过程中丢失next节点//头插head->next=cur;cur=head;head=next;}return cur;//cur最终指向原链表最后一个节点,即翻转后的第一个节点
}

💡 递归法,先递归到最后链表的最后一个节点处,然后在回退的时候进行翻指针

struct ListNode* ReverseList(struct ListNode* head ) 
{if(head==NULL||head->next==NULL){ return head; }struct ListNode* cur = ReverseList(head->next);// 这里的cur就是最后一个节点head->next->next = head;// 防止链表循环,需要将head.next设置为空head->next = NULL;// 每层递归函数都返回cur,也就是最后一个节点return cur;//这里就是将最后一个节点不断返回回去
}

💡 三指针法,就是用三个指针定位三个节点,做到翻指针的效果

struct ListNode *ReverseList(struct ListNode *head)
{if (head == NULL){return NULL;}struct ListNode *prv = NULL, *cur = head, *nxt = cur->next;while (cur){cur->next = prv;prv = cur;cur = nxt;if (nxt)nxt = nxt->next;}return prv;
}

链表的回文结构

  1. 先通过快慢指针的方式,找到链表中间节点。
  2. 再将后半部分链表进行反转。
  3. 最后将链表前半部分和反转后的后半部分链表逐节点进行比较判断。
class PalindromeList {public:bool chkPalindrome(ListNode* A) {if (A == nullptr || A->next == nullptr)return true;ListNode* slow, *fast;slow = fast = A;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}ListNode* prev, *cur, *nxt;prev = nullptr;cur = slow;while (cur) {nxt = cur->next;cur->next = prev;prev = cur;cur = nxt;}while (A && prev) {if (A->val != prev->val)return false;A = A->next;prev = prev->next;}return true;}};

左叶子之和

左叶子之和_牛客题霸_牛客网 (nowcoder.com)

class Solution {public:void _helper(TreeNode* root, int& sum) {if (root == nullptr)return;if (root->left && !root->left->left && !root->left->right)sum += root->left->val;_helper(root->left, sum);_helper(root->right, sum);}int sumOfLeftLeaves(TreeNode* root) {int sum = 0;_helper(root, sum);return sum;}
};

另一棵树的子树

572. 另一棵树的子树 - 力扣(LeetCode)

class Solution {
public:bool isSubtree(TreeNode* s, TreeNode* t) {if (!s && !t)return true;// 代码走到这里 已经保证s t不全空if (!s || !t)return false;return isSameTree(s, t) || isSubtree(s->left, t) ||isSubtree(s->right, t);}bool isSameTree(TreeNode* s, TreeNode* t) {if (!s && !t)return true; if (!s || !t)return false; return (s->val == t->val) && isSameTree(s->left, t->left) &&isSameTree(s->right, t->right);}
};

归并排序

递归

#include <iostream>
#include <vector>void merge(std::vector<int>& arr, int left, int mid, int right) {std::vector<int> leftArr(arr.begin() + left, arr.begin() + mid + 1);std::vector<int> rightArr(arr.begin() + mid + 1, arr.begin() + right + 1);int i = 0, j = 0, k = left;while (i < leftArr.size() && j < rightArr.size()) {if (leftArr[i] <= rightArr[j]) {arr[k++] = leftArr[i++];} else {arr[k++] = rightArr[j++];}}while (i < leftArr.size()) {arr[k++] = leftArr[i++];}while (j < rightArr.size()) {arr[k++] = rightArr[j++];}
}void merge_sort_recursive(std::vector<int>& arr, int left, int right) {if (left < right) {int mid = left + (right - left) / 2;merge_sort_recursive(arr, left, mid);merge_sort_recursive(arr, mid + 1, right);merge(arr, left, mid, right);}
}int main() {int N;std::cin >> N;std::vector<int> data(N);for (int i = 0; i < N; ++i) {std::cin >> data[i];}merge_sort_recursive(data, 0, N - 1);for (const auto& num : data) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

非递归

#include <iostream>
#include <vector>void merge(std::vector<int>& arr, int left, int mid, int right) {std::vector<int> leftArr(arr.begin() + left, arr.begin() + mid + 1);std::vector<int> rightArr(arr.begin() + mid + 1, arr.begin() + right + 1);int i = 0, j = 0, k = left;while (i < leftArr.size() && j < rightArr.size()) {if (leftArr[i] <= rightArr[j]) {arr[k++] = leftArr[i++];} else {arr[k++] = rightArr[j++];}}while (i < leftArr.size()) {arr[k++] = leftArr[i++];}while (j < rightArr.size()) {arr[k++] = rightArr[j++];}
}void merge_sort_iterative(std::vector<int>& arr)
{int n = arr.size();for (int size = 1; size < n; size *= 2) {for (int left = 0; left < n; left += 2 * size){int mid = std::min(left + size - 1, n - 1);int right = std::min((left + 2 * size - 1), (n - 1));if (mid < right) {merge(arr, left, mid, right);}}}
}int main() {int N;std::cin >> N;std::vector<int> data(N);for (int i = 0; i < N; ++i) {std::cin >> data[i];}merge_sort_iterative(data);for (const auto& num : data) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

类与对象

  1. 已知表达式++a中的"++"是作为成员函数重载的运算符,则与++a等效的运算符函数调用形式为:a.operator++();后置++a++ == a.operator++(0)

  2. c++中,ClassA的构造函数和析构函数的执行次数分别为:程序可能崩溃

    ClassA *pclassa=new ClassA[5];
    delete pclassa;
    
  3. resize和reserve

    int main()
    {string str("Hello Bit.");str.reserve(111);str.resize(5);str.reserve(50);cout << str.size() << ":" << str.capacity() << endl;return 0;
    }
    // linux:5:50
    // vs:   5:111
    
  4. 迭代器失效1.0

int main()
{int ar[] = { 1,2,3,4,0,5,6,7,8,9 };int n = sizeof(ar) / sizeof(int);vector<int> v(ar, ar + n);vector<int>::iterator it = v.begin();while (it != v.end()){if(*it == 0)v.erase(it);elsecout<<*it;it++;}return 0;
}

erase方法从vector容器中删除一个或多个元素,并调整vector的大小。删除元素后,后续元素会被移动以填补删除的空隙,此时it指向5,所有指向被删除元素之后的迭代器都会失效,即此时it失效linux允许执行 it++操作,故输出12346789;vs不允许,故崩溃。

解决

if(*it == 0)it = v.erase(it);
else
{cout<<*it;it++;
}
  1. 迭代器失效2.0
int main()
{Container cont = { 1, 2, 3, 4, 5};Container::iterator iter, tempIt;for (iter = cont.begin(); iter != cont.end();){tempIt = iter;++iter;cont.erase(tempIt);}
}
// 会导致代码片段崩溃的Container类型是(vector和deque)

vector和deque,erase操作会使所有指向被删除元素之后元素的迭代器、引用和指针都失效。

但对于list,erase操作只会使指向被删除元素的迭代器失效,其他迭代器、引用和指针仍然有效。

由题知虽然++iter迭代器了,但用erase(tempit)以后,vector、deque底层是连续空间,删除会挪动数据,最终导致iter意义改变,迭代器就已失效了。但是list,不是连续空间,删除以后tempIt虽然失效了,但是不影响iter。

  1. 引用

引用在定义时必须被初始化,并且必须绑定到一个已经存在的对象。
引用一旦被初始化并绑定到一个对象,就不能改变其绑定。
引用本身不是一个独立的对象,它只是被绑定对象的一个别名,因此不能定义引用的引用
引用本身不是对象,因此不能有指向引用的指针。指针可以指向对象,但不能直接指向引用。

  1. 析构函数与this指针
class A
{
public:~A(){delete this;this = NULL;}
};
析构函数内部调用delete -- 无限递归
this的类型`A* const this`,this不能更改指向,编译错误。故该程序在编译时就无法通过。
  1. 私有重写虚函数
class A
{
public:virtual void f(){cout << "A::f()" << endl;}
};
class B : public A
{
private:virtual void f(){cout << "B::f()" << endl;}
};
int main()
{A *pa = (A *)new B;pa->f();return 0;
}
// B::f()

编译时,不会确定具体调用哪个虚函数;只是进行语法检测,编译器检测到pa是A类型的指针,编译器会确定两件事:A类中有没有f()函数 + 该函数是否是public。如果满足这两个条件,那么编译通过,否则编译报错。显而易见,该代码可以编译通过,在运行时,pa是指向子类的基类指针,回去子类的虚表调用f(),改函数已被B重写故调用B::f()。

静态类型: 声明变量时给的类型A * pa=newB; pa的静态类型就是A * 。编译时看静态类型。

动态类型:实际指向或引用实体的类型pa的动态类型时B* , 运行时看的是动态类型。

  1. 判断题

被virtual修饰的函数称为虚函数 【❌】被virtual修饰的成员函数称为虚函数。友元函数不属于成员函数,不能成为虚函数。

位图可以很方便的进行字符串的映射以及查找【❌】采用位图标记字符串时,必须先将字符串转化为整形的数字,找到位图中对应的
比特位,但是在字符串转整形的过程中,可能会出现不同字符串转化为同一个整形数字,即冲突,因此一般不会直接用位图处理字符串。

set中存<key, key> unordered_set中存< key >

unordered _ map和unordered _ set:它们在进行元素插入时,都得要通过key的比较去找待插入元素的位置。【❌】不需要比较,只需要通过哈希函数,就可以确认元素需要存储的位置。

AVL树是一定需要旋转,红黑树不一定,比如插入的节点的parent节点为红色,uncle节点也为红色,那么只需要将父节点和叔叔节点颜色变黑,将grandfather的颜色变红,该种情况下,红黑树是不需要进行旋转的。AVL树和红黑树中序遍历都可以得到有序序列,因为它们都是二叉搜索树。【✔】

插入时,AVL树最多只需要旋转两次 :新结点插入前树已经是AVL树了,新结点插入后,如果导致某结点平衡因子为2或-2时,AVL树平衡性遭到破坏,以该结点为根的二叉树局部高度增加了一层,旋转完成后,该棵树高度和插入新结点前高度一致,所以旋转后对整棵树没有任何影响,旋转结束后树满足AVL树的特性。该旋转可能是单旋也可能是双旋,因此插入时AVL树最多只需要旋转两次。

删除时,只要某个节点的平衡因子不满足特性时 ,只需要对该棵子树进行旋转,就可以使AVL树再次平衡。错误,可能需要旋转多次,子树旋转后,其高度降低了一层,其上层可能也需要跟着旋转。

AVL树的节点中必须维护平衡因子,因为要依靠其平衡因子是否需要旋转以维护其平衡性 ,平衡因子不是必须要维护的,在操作时也可以直接通过高度函数来算,只不过比。较麻烦

AVL树的双旋转只需要直接使用对应的单旋转即可:不能直接使用单旋转,因为两个单旋转完成后,还需要对部分节点的平衡因子进
行更新

二叉树的后序非递归遍历中,需要的额外空间:需要一个栈模拟递归的过程,一个顺序表保存节点。同时还需要一个prev节点保存刚刚遍历过的结点来解决某个结点有右子树时的死循环问题。

  1. 多态经典代码
class A
{
public:A(): m_iVal(0){test();}virtual void func(){std::cout << m_iVal << ' ';}void test(){func();}public:int m_iVal;
};
class B : public A
{
public:B(){test();}virtual void func(){++m_iVal;std::cout << m_iVal << ' ';}
};
int main(int argc, char *argv[])
{A *p = new B;p->test();return 0;
}
// 0 1 2

编程训练

杨辉三角

class Solution 
{public:vector<vector<int>> generate(int numRows) {vector<vector<int>> t;for (int i = 0; i < numRows; i++){vector<int> row(i + 1, 1);for (int j = 1; j < i; j++) {row[j]  = t[i - 1][j - 1] + t[i - 1][j];}t.push_back(row);}return t;}
};

字符串乘积

在这里插入图片描述

模拟手工计算两个大数相乘,从低位到高位,每次计算一对对应位的乘积,然后加上进位和之前的结果,更新当前位的结果和进位。

class Solution
{
public:string solve(string num1, string num2){if (num1 == "0" || num2 == "0"){return "0";}reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());string ans(num1.size() + num2.size(), '0');int carry = 0;for (int i = 0; i < num1.size(); ++i){for (int j = 0; j < num2.size(); ++j){// 当前位的结果等于之前的进位加上两数当前位的乘积和之前计算的结果carry += (num1[i] - '0') * (num2[j] - '0') + (ans[i + j] - '0');// 计算当前位的结果,保存到结果中ans[i + j] = carry % 10 + '0';// 更新进位carry /= 10;}// 如果最后还有进位,将进位加到结果中if (carry > 0){ans[i + num2.size()] = (carry + '0');carry = 0;}}// 如果最高位为0(即未被使用),则去掉最高位if (ans.size() >= 2 && ans.back() == '0'){ans.pop_back();}// 将结果反转回正确的顺序reverse(ans.begin(), ans.end());// 返回结果return ans;}
};

逻辑更清晰 用vector暂存每位结果 只加不进

class Solution
{
public:string solve(string s, string t){// 其中一个数为0if (s == "0" || t == "0"){return "0";}int sNum = s.size();int tNum = t.size();vector<int> tmp(sNum + tNum); // save per addstring ret;// reverse s treverse(s.begin(), s.end());reverse(t.begin(), t.end());// only add not carryfor (int i = 0; i < sNum; i++){for (int j = 0; j < tNum; j++){tmp[i + j] += (s[i] - '0') * (t[j] - '0');}}// deal carryint carry = 0;for (auto per : tmp){per += carry;ret += per % 10 + '0';carry = per / 10;}// max high carrywhile (carry){ret += carry % 10 + '0';carry /= 10;}// prev zerowhile (ret.size() >= 2 && ret.back() == '0'){ret.pop_back();}reverse(ret.begin(), ret.end());return ret;}
};

二叉树前序遍历成字符串

606. 根据二叉树创建字符串 - 力扣(LeetCode)

一棵树只有这五种情况:

只有根节点

只有左子树

只有右子树

左右子树都有

法一

  1. 如果左子树为真,需要加括号
  2. 如果左子树为空,右子树为真,需要给左子树加()不破坏输入与输出一一映射的关系
  3. 如果左右子树都为空,则不需要加括号
  4. 当右子树为空,不需要加括号
class Solution {public:string tree2str(TreeNode* root) {if (root == nullptr){return "";}string ret;ret += to_string(root->val);//左子树为真,需要加括号。如果没有左子树,但是有右子树为了不破坏输入与输出一一映射的关系,同样需要加括号if (root->left || root->right){ret+= '(';ret += tree2str(root->left);ret += ')';}if (root->right){ret+= '(';ret += tree2str(root->right);ret += ')';}return ret;}
};

法二:

  1. 当节点为叶子节点时不需要加括号。

  2. 当左子树存在,右子树为空时,需要给左子树加上括号。

  3. 当左右子树都为真就去递归加括号或者左子树为空右子树为真,这个时候为了不破坏输入与输出一一映射的关系,需要加左括号

    class Solution {public:string tree2str(TreeNode *root) {// 空树if (root == nullptr) {return "";}// 只有根节点if (root->left == nullptr && root->right == nullptr) {return to_string(root->val);}// 只有左子树if (root->right == nullptr) {return to_string(root->val) + "(" + tree2str(root->left) + ")";}// 只有右子树 + 左右子树都有return to_string(root->val) + "(" + tree2str(root->left) + ")(" +tree2str(root->right) + ")";}
    };
    

法三:迭代

class Solution {
public:string tree2str(TreeNode *root) {string ans = "";stack<TreeNode *> st;st.push(root);unordered_set<TreeNode *> vis;while (!st.empty()) {auto node = st.top();if (vis.count(node)) {if (node != root) {ans += ")";}st.pop();} else {vis.insert(node);if (node != root) {ans += "(";}ans += to_string(node->val);if (node->left == nullptr && node->right != nullptr) {ans += "()";}if (node->right != nullptr) {st.push(node->right);}if (node->left != nullptr) {st.push(node->left);}}}return ans;}
};

数组的交集

只求交集 不管是否重复

class Solution 
{
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> us1, us2;for (auto& e : nums1)us1.insert(e);for (auto& e : nums2)us2.insert(e);return get(us1, us2);}vector<int> get(unordered_set<int>& us1, unordered_set<int>& us2) {if (us1.size() > us2.size())return get(us2, us1);vector<int> v;for (auto& e : us1){if (us2.count(e))v.push_back(e);}return v;}
};

交集元素有多个

//法一:排序+双指针
//1.1 用multiset排序
class Solution
{public:vector<int> intersect(vector<int> &nums1, vector<int> &nums2){multiset<int> ms1(nums1.begin(), nums1.end());multiset<int> ms2(nums2.begin(), nums2.end());multiset<int>::iterator it1 = ms1.begin();multiset<int>::iterator it2 = ms2.begin();vector<int> v;while (it1 != ms1.end() && it2 != ms2.end()){if (*it1 < *it2)++it1;else if (*it1 > *it2)++it2;else{v.push_back(*it1);++it1;++it2;}}return v;}
};
//1.2 用sort排序
class Solution 
{public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2){sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 = nums1.size(), length2 = nums2.size();vector<int> intersection;int index1 = 0, index2 = 0;while (index1 < length1 && index2 < length2){if (nums1[index1] < nums2[index2]) {index1++;} else if (nums1[index1] > nums2[index2]) {index2++;} else {intersection.push_back(nums1[index1]);index1++;index2++;}}return intersection;}
};
//法二:哈希表
class Solution 
{public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {if (nums1.size() > nums2.size()) {return intersect(nums2, nums1);}unordered_map <int, int> m;for (int num : nums1){++m[num];}vector<int> intersection;for (int num : nums2) {if (m.count(num)) {intersection.push_back(num);--m[num];if (m[num] == 0){m.erase(num);}}}return intersection;}
};

二叉树的非递归前序遍历

class Solution {
public:vector<int> preorderTraversal(TreeNode* root)
{vector<int> v;stack<TreeNode*> st;TreeNode* cp = root;while (cp || !st.empty()){//左路结点while (cp){v.push_back(cp->val);st.push(cp);cp = cp->left;}//左路结点的右子树TreeNode* top = st.top();st.pop();cp = top->right;}return v;
}
};

连续子数组的最大乘积

#include<vector>
#include<cstdlib>
#include<climits>
#include<iostream>
using namespace std;
//暴力解法
int maxProductSubarray(vector<int>& nums) 
{int n = nums.size();int maxnum = INT_MIN;for (int start = 0; start < n; ++start) {//更新cur 下次重新记录start位置的最大乘积int cur = 1;for (int end = start; end < n; ++end) {//计算从start位置开始向后的乘积cur *= nums[end];if (cur > maxnum){maxnum = cur;}}}return maxnum;
}
int main() 
{int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}int result = maxProductSubarray(nums);cout << result << endl;return 0;
}
class Solution {public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1), g(n + 1);f[0] = g[0] = 1;int ret = INT_MIN;for (int i = 1; i <= n; i++) {int x = nums[i - 1];int y = f[i - 1] * x;int z = g[i - 1] * x;f[i] = max(x, max(y, z));g[i] = min(x, min(y, z));ret = max(ret, f[i]);}return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 聚合函数

1. AVG函数求平均值 以 teacher 表为例&#xff0c;先查所有 teacher 信息&#xff1a; SELECT * FROM teacher;查询结果如下图&#xff1a; 可以使用 AVG() 函数求出全部教师平均年龄&#xff1a; SELECT AVG(age) FROM teacher;执行结果如下图&#xff1a; Tips&#…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”&#xff0c;白嫖党最爱&#xff0c;主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧&#xff0c;只能自己一页一页的翻去查看&#xff0c;非常麻烦。 自己找限…

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤&#xff0c;也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制&#xff0c;所以当更换了笔记本或者更换了无线网卡的时候&#xff0c;也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载&#xff1a;https://do…

各种查询sql介绍

1. 关联查询&#xff08;JOIN&#xff09; 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段&#xff08;通常是主键和外键&#xff09;来组合数据。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; sql SELECT a.name, b.order_date FROM custome…

计算机网络——CDN

空间编码例子&#xff1a;不是发送N个相同颜色值&#xff0c;而是仅发送2个值&#xff0c;颜色和重复个数 时间编码例子&#xff1a;不是发送i1帧的全部编码&#xff0c;而是仅发送帧i差别的地方 视频播放时&#xff0c;先下载manifest file文件——>解析&#xff08;不…

机器学习与神经网络:科技的星辰大海

前提 近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

Faster R-CNN模型微调检测航拍图像中的小物体

1. 项目简介 本项目的目标是基于Faster R-CNN模型对航拍图像中的小物体进行检测和识别。航拍图像通常具有视角广、分辨率高、小目标密集且物体尺寸较小的特点&#xff0c;因此检测难度较大。传统的目标检测模型在处理小物体时&#xff0c;容易受到物体尺寸、分辨率及背景复杂度…

大数据查询引擎之Tez

Apache Tez 是一个用于大数据处理的分布式计算框架&#xff0c;旨在提高 Hadoop 的 MapReduce 计算引擎的效率和性能。它是一个面向 DAG&#xff08;有向无环图&#xff09;任务执行的框架&#xff0c;主要用于大规模数据处理场景中&#xff0c;特别是在 Apache Hadoop 生态系统…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

轻量级可视化数据分析报表,分组汇总表!

什么是可视化分组汇总表&#xff1f; 可视化分组汇总表&#xff0c;是一种结合了数据分组、聚合计算与视觉呈现功能的数据分析展示功能。它能够按照指定的维度&#xff08;如时间、地区、产品类型等&#xff09;对数据进行分组&#xff0c;还能自动计算各组的统计指标&#xf…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

SQL Injection | SQL 注入 —— 报错盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;报错盲注 —— 理论篇 报错盲注&#xff08;Error-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会直接显示后端处理结果的查询方式…

安装nginx实现多ip访问多网站

关闭防火墙并停selinux&#xff1a; 挂载&#xff1a; 安装nginx&#xff1a; 判断nginx是否成功启动&#xff1a; 打开nmtui并添加多个ip&#xff1a; 重启nmtui&#xff1a; 查看多ip是否配置成功: 配置文件&#xff1a; 创建文件&#xff1a; 根据配置在主机创建数据文件&a…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十一)ESKF中融合速度观测量;发散的原因;如何解决发散;以及对slam的理解

带着问题去学习: 1、slam发散的原因? 2、如何解决/限制发散? 3、如何在已经有观察值和预测值的ESKF中,再引入一个其他其他观察量? 一、多传感器融合的思考——轮速计 反思为何需要融合多个传感器? 我认为根本上的原因,是因为有些传感器在某些场景下会失灵、效果不佳…

aws(学习笔记第七课) 私有子网使用NAT服务器

aws(学习笔记第七课) AWS的私有子网使用NAT服务器 学习内容&#xff1a; AWS的私有子网使用NAT服务器 1. AWS的私有子网使用NAT服务器 在上面的例子的网络构成图中&#xff0c;可能会发现一个问题。就是Private Subnet的Apache server无法访问互联网。比如&#xff0c;当需要…

云计算-----单机LNMP结构WordPress网站

LNMP结构 博客网站 day1 小伙伴们&#xff0c;LNMP结构在第一二阶段浅浅的学习过&#xff0c;这里我们可以离线部署该结构。L指&#xff08;虚拟机&#xff09;服务器&#xff0c;nginx&#xff08;前端代理服务器&#xff09;mysql数据库&#xff0c;最后基于php建设动态…

DockerCompose快速部署Java项目、nginx前端和mysql数据库到centos虚拟机

简介&#xff1a;整理自&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09;课程的飞书文档。 DockerCompose介绍 大家可以看到&#xff0c;我们部署一个简单的java项…

黑马程序员Java笔记整理(day03)

1.switch 2.for与while对比 3.嵌套定义,输出的区别性 4.break与continue 5.随机数生成的两种方式 6.Random 7.随机验证码

到底是微服务,还是SOA?

引言&#xff1a;大概正式工作有5年了&#xff0c;换了三个大厂【也是真特么世道艰难&#xff0c;中国互联网人才饱和了】。基本上每个公司有的架构都不太相同&#xff0c;干过TOC和TOB的业务&#xff0c;但是大家用的架构都不太相同。有坚持ALL in one的SB&#xff0c;最后服务…