开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
选择题
显然时间复杂度为
O(m*n)
对于链表来说,存储顺序和逻辑顺序是没有必要的联系的,因为每个节点都是动态的。那么对表中的数据进行插入和删除的时候也是不需要移动元素的。
ABD都是链表的优点就不用多说了。链表存储的空间不一定比线性表节省,因为它除了要存储数据外还有存储下一个节点的地址。
先把后面的节点处理好,然后再处理h节点。如图所示
针对c选项:第一个出队的是d,那么abc都已经进入队列中了,那么不可能第二个出队列的为b,出b之前必要出c。所以c选项错误。
度为0的节点个数比度为2的节点度数+1.
A:3号节点不平衡 B:7号节点不平衡 D:6号节点的存在导致该二叉树不是搜索二叉树
插入前
插入后
如果是查找的是发生冲突的数据,那么就不能在常数的时间内找到特定记录,最坏的情况是在
O(N)
的情况下查找到。由于数据量比较大的时候,就不可能把所有的记录存储在内存中,而要存储在磁盘中。哈希函数的选取和字段A还是有关的,字符串和数字就可以需要选择不同的函数。
很显然内存是直接对数据进行排序是不可能的,而归并排序可以借助磁盘是的空间进行排序。因为归并是把数据进行细分然后再归并的过程。小的数据量在内存中是可以进行排序的。
编程题
先假设这个众数为就是第一个数,然后用一个变量记录众数的个数。 我们用众数抵消法:意思就是,从第2个数开始遍历,如果和假设的众数相等,个数就加1;反之就减1,当个数小于等于0的时候,说明假设的这个暂时不是众数,重新假设众数是现在正在遍历的这个数,直到遍历完。 最后对遍历完的那个众数进行验证,如果是众数,就返回,反之,返回0.
class Gift {
public:
int getValue(vector<int> gifts, int n) {
int ret=gifts[0];
int count=1;
for(int i=1;i<n;i++)
{
if(ret==gifts[i])
count++;
else
{
count--;
if(count<=0)
{
count=1;
ret=gifts[i];
}
}
}
count=0;
for(auto x:gifts)
if(x==ret)
count++;
if(count>n/2)
return ret;
else
return 0;
}
};
本题显然是一个动态规划的问题,我们用
f[i][j]
表示字符串str1在i位置与str2在j位置的的最小编辑距离。 那么f[i][j]
怎么求呢?当str1[i]==str2[j]的时候f[i][j]=f[i-1][j-1]
,当str1[i]!=str2[j]的时候,f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j])+1)
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int LD(string& str1,string& str2)
{
vector<vector<int>> f(1001,vector<int>(1001,0));
for(int i=0;i<=str1.size();i++)
{
f[i][0]=i;
}
for(int i=0;i<=str2.size();i++)
{
f[0][i]=i;
}
for(int i=0;i<str1.size();i++)
{
for(int j=0;j<str2.size();j++)
{
if(str1[i]==str2[j])
{
f[i+1][j+1]=f[i][j];
}
else
{
f[i+1][j+1]=min(f[i+1][j],f[i][j+1])+1;
f[i+1][j+1]=min(f[i+1][j+1],f[i][j]+1);
}
}
}
return f[str1.size()][str2.size()];
}
int main()
{
string str1,str2;
cin>>str1>>str2;
int ret=LD(str1,str2);
cout<<ret<<endl;
return 0;
}