使用拉链法解决哈希冲突插入失败(C++实现),求教,谢谢各位大哥!

插入函数使用尾插法,附带了简单的测试代码,输出结果为空,求教。

template<typename DataType>
struct Node
{
    DataType data;
    Node<DataType> *next;
};
const int MaxSize = 101;
Node<int> *ARR[MaxSize];
//使用拉链法解决散列冲突
void Insert(int data) {
    if (ARR[data]==NULL) {
        Node<int> * s = new Node<int>;
        s->data = data;
        ARR[data] = s;
        s->next = NULL;
    }
    else {

        Node<int> * p = ARR[data];
        while (p) {
            p = p->next;
        }
            Node<int> * s = new Node<int>;
            s->data = data;
            p = s;
            s->next = NULL;

}
int main() {
    int a[10] = { 5,5,6,7,8,9,10,12,14,15};
    for (int i = 0; i < 10; i++) {
        Insert(a[i]);
    }
    std::cout << ARR[5]->next->data;
}
    Node<int> * p = ARR[data];  //注意其作用域,不能每次都声明一遍
    if (ARR[data]==NULL) {
        Node<int> * s = new Node<int>;
        s->data = data;
        ARR[data] = s;
        s->next = NULL;
    }
    else {
        Node<int> * s = new Node<int>;
        s->data = data;
        s->next = p->next;
        p->next = s;
        p = s;
    }
    尾插法错误!!!
c++

2个回答

RoyNewDawn
RoyNewDawn 我看了,跟我的需求不一样啊,我这个只是简单的希望保持队列的次序,先插入的,如果有输出,先输出。我只想知道我的尾插法错在哪里了?谢谢哥
3 个月之前 回复

尾插法应该维护一个尾指针,我看了你找尾指针的过程,
这个指针P实际上最后是指向了P,是尾指针的下一结点,是个NULL,
所以,你修改P为新指针也没有啊。

Node<int> * p = ARR[data];
        while (p->next) { // 尾指针的后继为空
            p = p->next;
        }
            Node<int> * s = new Node<int>;
            s->data = data;
            s->next = p->next;
                        p->next = s;
RoyNewDawn
RoyNewDawn 瞬间明白了,我while要找到的是指向最后一个结点的指针,而不是最后一个结点的next域(空结点)这样修改一下,就不会又误区了,我又进去了。谢谢哥
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用拉链法解决哈希冲突插入失败(C++实现),求教,谢谢各位大哥!
插入函数使用尾插法,附带了简单的测试代码,输出结果为空,求教。 ``` template<typename DataType> struct Node { DataType data; Node<DataType> *next; }; const int MaxSize = 101; Node<int> *ARR[MaxSize]; //使用拉链法解决散列冲突 void Insert(int data) { if (ARR[data]==NULL) { Node<int> * s = new Node<int>; s->data = data; ARR[data] = s; s->next = NULL; } else { Node<int> * p = ARR[data]; while (p) { p = p->next; } Node<int> * s = new Node<int>; s->data = data; p = s; s->next = NULL; } int main() { int a[10] = { 5,5,6,7,8,9,10,12,14,15}; for (int i = 0; i < 10; i++) { Insert(a[i]); } std::cout << ARR[5]->next->data; } ``` ``` Node<int> * p = ARR[data]; //注意其作用域,不能每次都声明一遍 if (ARR[data]==NULL) { Node<int> * s = new Node<int>; s->data = data; ARR[data] = s; s->next = NULL; } else { Node<int> * s = new Node<int>; s->data = data; s->next = p->next; p->next = s; p = s; } 尾插法错误!!! ```
使用拉链法哈希表插入失败
这里用的是尾插法,数组默认为NULL; ``` const int MaxSize = 101; Node<int> *ARR[MaxSize]; //使用拉链法解决散列冲突 void Insert(int data) { if (ARR[data]==NULL) { Node<int> * s = new Node<int>; s->data = data; ARR[data] = s; s->next = NULL; } else { while (ARR[data]) { ARR[data] = ARR[data]->next; } Node<int> * s = new Node<int>; s->data = data; ARR[data] = s; s->next = NULL; } } //附上一段简单的测试代码 int main() { int a[10] = { 1,5,6,7,8,9,10,12,14,5}; std::cout << ARR[5]->next->data; ```
哈希表用拉链法解决冲突的时候怎么根据K进行查找值?
哈希表用拉链法解决冲突的时候怎么根据K进行查找值?假如k1,k2有冲突,现在查找k2的值?怎么查找。
如何解决哈希表的拉链法的缺点?
也就是拉链特别长的时候,有什么好办法能够解决的吗?主要是为了解决查询的效率问题,我想过把拉链变为一棵红黑树,除了这个办法以外还有什么好办法吗?
数据结构上的一个线性表的冲突的解决,是不是用哈希算法怎么采用C语言的实现方式
数据结构上的一个线性表的冲突的解决,是不是用哈希算法怎么采用C语言的实现方式
设计一个好的哈希函数,可以从根本上避免冲突.这个判断题是对的吗?
请大牛讲讲冲突的根本原因以及解决的根本方法。我在学习数据结构的课程时,老师没有详细解说冲突的产生原因只和我们讲了集中减少冲突的算法。
Java中迭代器对象的一个疑问
最近学习了Java的迭代器对象(iterator),它有一个方法是.next(),返回下一个,或者说游标刚刚经过的那一个元素,很好理解,但是使用的时候却让我有些疑惑 完整代码如下 ``` public static void main(String[] args) { // TODO Auto-generated method stub //1)创建一个String集合,并添加元素 Collection collection01 = new LinkedList(); collection01.add("123"); collection01.add("456"); collection01.add("789"); //2)创建一个String的迭代器对象 Iterator<String> iterator01 = collection01.iterator(); //3)使用迭代器对象遍历集合 while(iterator01.hasNext()) { String thisString = iterator01.next();//指向下一个元素 System.out.println(thisString + '\t'); } } ``` 当while中的代码是先新建一个String对象,然后把.next()的值赋值给String对象时,得到的结果是正常的输出值,但是如果while循环的写法是下面这种 ``` while(iterator01.hasNext()) { iterator01.next(); System.out.println(iterator01.toString()); } ``` 得到的结果却是完整类名加哈希码,或者不用toString(),直接输出也是完整类名加哈希码,这是为什么呢,它在第一种写法里被强制类型转换了吗?
哈希表在插入时发生了冲突,在查找时如何避过冲突的
比如键值1和3通过哈希函数计算后都是2,3计算得到的偏移之后变成3了,现在我查找时1,3都是2。我如何让3找到3呢?
怎么提高哈希表插入效率?
key 值和 value 都是长整形,key 值可以重复 ,即一个 key值可以有多个 value 值, 各位大牛有没有什么好的想法觉得可以加快插入速度,比如多线程?
一个关于用户、动态、评论的分库分表方案?
1、现在有一个用户表、一个动态表、一个评论表,其中用户--动态 是 1-N,用户 -- 评论 是 1-N,动态 -- 评论 是 1-N。 即一个用户可以发多条动态,一个用户也可以发多条评论,一条动态下面会有很多评论。 现在由于数据量大,需要进行分库分表,分库分表方案需满足如下要求: * 能很快按评论时间倒序分页查出一条动态的评论; * 一个用户能很快按发布时间倒序分页查出自己发布的动态; * 一个用户能很快按评论时间倒序分页查出自己发的评论; 请问有什么好的分库分表方案? 比如按用户ID哈希取模,还是按用户ID大小分段,还是其他的什么组合?有没有现成的一些好的方案? _现在C币不足,若有好答案,必定充值重谢!!!_
哈希表 计算失败平均查找长度
![图片说明](https://img-ask.csdn.net/upload/201602/09/1455031746_265651.png) 这个失败的长度是怎么计算出来的? 分子是怎么来的? 请大家具体讲讲~
怎么用MFC实现哈希表的建立,插入,删除和查找呢?有没有前辈有源代码可供参考呢?
用MFC实现一个哈希表的建立,插入,删除和查找功能,输入的为数字。有没有大神有源代码~
哈希表实现快速查找问题
随机生成一个含有1000个数据的测试数据,数据形式可以如下所示(测试数据不一定要和以下一样,可以自己设计): Key Value 张三1 11111111 张三2 12222222 … 李四1 21111111 李四2 22222222 … 王五1 31111111 王五2 32222222 … 同时把该数据输出到一个文本文件中,将来用于比对。 2:使用哈希表存储以上数据(在存储数据时要考虑哈希函数的设计,冲突解决方法等问题) 3:使用普通的链表存储以上数据 4:分别使用相同的数据测试查找速度10000,100000,1000000,…并记录时间,比较两者有何不同。(以姓名进行查找) 求各位大神帮忙编写代码
c#委托和事件的具体使用,和回调函数该怎么用,哈希表是怎么回事?
c#委托和事件的具体使用,和回调函数该怎么用,哈希表是怎么回事?
Java 从键盘输入一组点的坐标,统计点的个数并输出去除重后点的坐标
从键盘输入一组点的坐标,统计点的个数(去除重复点,利用HashSet实现),并输出集合中的元素个数及所有点的坐标信息,其中哈希函数Hash(x,y)=(x*x+y*y) mod 11(x,y是点的坐标,mod表示求余运算),输入输出示例如下: 输入: 6 1 2 3 3 1 2 5 6 2 8 5 6 输出: 集合中的点的个数:4 集合中的点的坐标信息:(1,2),(3,3),(5,6),(2,8)
哈希表判断冲突的条件有点不懂
void CreateHashList() { int i; for(i=0; i<HASH_LENGTH;i++) { HashList[i].py=""; HashList[i].k=0; HashList[i].si=0; } for(i=0;i<HASH_LENGTH;i++) { int sum=0; int adr=(NameList[i].k)%M; //哈希函数 int d=adr; if(HashList[adr].si==0) //如果不冲突 { HashList[adr].k=NameList[i].k; HashList[adr].py=NameList[i].py; HashList[adr].si=1; } else //冲突 { do { d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突 sum=sum+1; //查找次数加1 }while (HashList[d].k!=0); HashList[d].k=NameList[i].k; 一开始不是用循环给所有的Hashlist[i].k赋值为0啦吗,为什么后面判断冲突的循环终止的条件是while (HashList[d].k!=0);不是所有Hashlist[i].k赋值为0啦吗,那样不就是覆盖已经填有数据的地址吗
哈希查找程序中的几个问题
本人新手,接触到哈希查找,有几个问题看不懂,希望大家指点迷津,多谢。 #include"stdio.h" #include"malloc.h" //定义查找的节点元素 typedef struct { int num; char name[20]; }ElemType; //定义哈希表 typedef struct { ElemType *elem; int count; int sizeindex; }HashTable; //定义哈希函数 int Hash(int num) { int p; p=num%5; return p; } //创建哈希表 void InitHash(HashTable *H) { int i; int MAX=sizeof(HashTable); H->elem=(ElemType *)malloc(MAX*sizeof(ElemType)); H->count=0; H->sizeindex=MAX; for(i=0;i<MAX;i++) H->elem[i].num=0; //初始化,是SearHash()函数能够判断到底有没有元素在里面 } //定义查找函数 int SearHash(HashTable H,int key,int *p) { int c=0; *p=Hash(key); while(H.elem[*p].num!=key&&H.elem[*p].num!=0)//通过二次探测再散列解决冲突 { c=c+1; if(c%2==1) *p=*p+(c+1)*(c+1)/4; else *p=*p-(c*c)/4; } if(H.elem[*p].num==key) return 1; else return 0; } //插入函数 //如果查找不到就插入元素 void InsertHash(HashTable *H,ElemType e) { int p; SearHash(*H,e.num,&p); H->elem[p]=e; ++H->count; } //主函数 void main() { HashTable H; int p,key,i; ElemType e; InitHash(&H); for(i=0;i<3;i++) //输入3个元素 { loop:printf("输入第%d个学生学号\n",i+1); scanf("%d",&e.num); //输入学号 if(!SearHash(H,e.num,&p)) { printf("输入第%d个学生名字\n",i+1); scanf("%s",e.name); //输入名字 InsertHash(&H,e); //插入元素 } else { printf("该学号已经存在\n");//否则就表示元素的学号已经存在 goto loop;//跳到loop处 } } printf("请输入您要查找的学生学号:\n"); scanf("%d",&key);//输入要查找的学号 if(SearHash(H,key,&p))//能查找成功 { printf("查找成功!学生的姓名是%s\n\n",H.elem[p].name);//输出名字 printf("学生所在表中的位置是%d\n\n",p);//输出位置 } else printf("查找失败!您要找的学生不存在\n\n"); } 1. List item 这是一本讲算法的书中关于哈希查找算法的例子 有几个问题: 1.定义哈希表的结构体中,elem是一个指向结构体变量ElemType的指针,并不是数组,但是为什么会在后面的代码中出现像 H->elem[i].num=0;这样的语句? 2.定义哈希表的结构体中 count和sizeindex表示什么? 3.创建哈希表函数中的MAX是什么东西? 4.查找函数这段代码看不懂,关于c和p的处理是什么意思? while(H.elem[*p].num!=key&&H.elem[*p].num!=0)//通过二次探测再散列解决冲突 { c=c+1; if(c%2==1) *p=*p+(c+1)*(c+1)/4; else *p=*p-(c*c)/4; } if(H.elem[*p].num==key) return 1; else return 0; 5.插入函数中的p是什么?不需要初始化? void InsertHash(HashTable *H,ElemType e) { int p; SearHash(*H,e.num,&p); H->elem[p]=e; ++H->count; } 6.主函数中,p好像也没有初始化,但是可以使用p输出学生的名字和位置? if(SearHash(H,key,&p))//能查找成功 { printf("查找成功!学生的姓名是%s\n\n",H.elem[p].name);//输出名字 printf("学生所在表中的位置是%d\n\n",p);//输出位置 }
哈希查找中计算查找次数和冲突次数
代码如下,在计算冲突次数和查找次数的时候,HS.con和count两个变量都不能正确更新,不知道哪里有问题,请教各位大神,谢谢! ``` #include <iostream> #include <fstream> #include <string> #include <iomanip> #include <cstring> using namespace std; const int TOTAL = 32; const int MAXLEN = 10; const int HASHLEN = 41; int cont = 0; class HashTable { public: char keyword[MAXLEN]; int count; int num; }; HashTable HS[HASHLEN]; char KeyWords[TOTAL][MAXLEN] = { "char", "double", "enum", "float", "int", "long", "short", "signed", "struct", "union", "unsigned", "void", "break", "case", "continue", "default", "do", "else", "for", "goto", "if", "return","switch","while", "auto", "extern", "register", "static", "const", "sizeof", "typedef", "volatile" }; template <class T> class HASH { public: void Show(int key); int CreatHX(char *keyword); int GetFreePos(int key); void ResetHX(); int GetKey(char *keyword); int isKeyWords(char *word); int Read(char *filename); int isLetter(char ch); int FindHX(char *keyword); private: int key; char *keyword; char *word; char ch; }; template <class T> void HASH<T>::Show(int key) { if(key<0 || key>=HASHLEN) { cout<<"关键字不存在!"<<endl; return; } if(strlen(HS[key].keyword)==0) { cout<<"哈希表位置:"<<key<<"记录是空的"<<endl; return; } cout<<"哈希表位置:"<<key<<"关键字:"<<HS[key].keyword<<" 出现次数"<<HS[key].count<<endl; cont++; } template <class T> int HASH<T>::CreatHX(char *keyword) { int key; if ( !isKeyWords( keyword ) ) return(-1); key = GetKey( keyword ); if ( strlen( HS[key].keyword ) > 0 ) { if ( strcmp( HS[key].keyword, keyword ) == 0 ) { HS[key].count++; return(1); } key = FindHX( keyword ); if ( key < 0 ) { key = GetFreePos( GetKey( keyword ) ); if ( key < 0 ) return(-1); strcpy( HS[key].keyword, keyword ); } if ( key < 0 ) return(-1); HS[key].count++; } else { strcpy(HS[key].keyword, keyword ); HS[key].count++; } return(1); } template<class T> int HASH<T>::GetFreePos( int key ) { int find, tem = 0; if ( key < 0 || key >= HASHLEN ) return(-1); for(find = key+1; find<HASHLEN; find++) { tem++; if ( strlen( HS[find].keyword ) == 0 ) { HS[find].num = tem; return(find); } } for ( find = 0; find < key; find++ ) { tem++; if(strlen(HS[find].keyword)==0) { HS[find].num = tem; return find; } } return -1; } template<class T> void HASH<T>::ResetHX() { int i; for(i=0;i<HASHLEN;i++) { strcpy(HS[i].keyword,""); HS[i].count=0; HS[i].num=0; } } template<class T> int HASH<T>::GetKey(char *keyword) { return ((keyword[0]*100 + keyword[strlen(keyword)-1]) % 41); } template<class T> int HASH<T>::isKeyWords(char *word) { int i; for(i=0;i<TOTAL;i++) if(strcmp(word,KeyWords[i])==0) return 1; return 0; } template<class T> int HASH<T>::isLetter(char ch) { if((ch>='a' && ch <= 'z')||(ch > 'A' && ch <= 'Z')) return 1; else return 0; } template<class T> int HASH<T>::FindHX( char *keyword ) { int key, find, tem = 0; if ( !isKeyWords( keyword ) ) return(-1); key = GetKey( keyword ); if ( strcmp( HS[key].keyword, keyword ) == 0 ) return(key); for ( find = key + 1; find < HASHLEN; find++ ) { tem++; if ( strcmp( HS[find].keyword, keyword ) == 0 ) { HS[find].num = tem; return(find); } } for ( find = 0; find < key; find++ ) { tem++; if ( strcmp( HS[find].keyword, keyword ) == 0 ) { HS[find].num = tem; return(find); } } return(-1); } template<class T> int HASH<T>::Read( char *filename ) { char word[MAXLEN], ch; int i; FILE *read; fstream myfile; myfile.open(filename); if ( !myfile ) { cout<<"文件不存在,请确认好再输入!"<<endl; return(-1); } ResetHX(); while ( !feof( read ) ) { i = 0; ch = fgetc( read ); while ( isLetter( ch ) == 0 && feof( read ) == 0 ) ch = fgetc( read ); while ( isLetter( ch ) == 1 && feof( read ) == 0 ) { if ( i == MAXLEN ) { while ( isLetter( ch ) == 1 && feof( read ) == 0 ) { ch = fgetc( read ); } i = 0; break; } else { word[i++] = ch; ch = fgetc( read ); } } word[i] = 0 ; if ( isKeyWords( word ) ) { CreatHX( word ); } } fclose( read ); cout<<"读取成功,文件中关键字已经存入hash表,请继续操作"<<endl; return(1); } int main() { HASH<char> hash; char filename[128], word[MAXLEN]; int i = 0, count = 0; int key; char j, y; cout << "请输入要读取的文件 : "; cin>>filename; cout<<endl; hash.Read( filename ); for ( i = 0; i < HASHLEN; i++ ) { hash.Show( i ); getchar(); } cout<<"关键字总数为 :"<<cont<<endl; cout<<"请输入你想要查找的关键字 :"; cin>>word; cout<<endl; hash.Show( hash.FindHX( word ) ); cout<<"C语言中的关键字和其在hash表的位置 : "<<endl; for ( i = 0; i < TOTAL; i++ ) { cout<<setiosflags( ios::left ) <<"["<<setw(2)<<hash.GetKey(KeyWords[i])<<"] " <<setiosflags(ios::left)<<setw( 11 )<<KeyWords[i]; if((i+1) % 4 == 0) cout<<endl; } cout<<"是否显示冲突关键字列表? y(是)其它(否):"; cin>>j; if(j=='y') { cout<<"冲突关键字列表"<<endl; for(i=0;i<HASHLEN;i++) { if(strlen(HS[i].keyword)>0) { key=hash.GetKey(HS[i].keyword); if(key!=i) { count++; cout<<setiosflags(ios::left)<<setw(14)<<"\t[关键字]:" <<HS[i].keyword<<setiosflags( ios::left ) << setw( 20 ) << "\t[哈希表当前位置] :" << i << setiosflags( ios::left ) << setw( 20 ) << "\t[冲突次数] :"<< HS[i].num<<endl; } } if ( count == 0 ) cout<<"没有冲突"<<endl; else cout<<"\t 冲突关键字共 : "<<count<< "个"<< endl; } } else cout<<"不显示冲突关键字列表,但已存在!"<<endl; return 0; } ```
Linux环境如何建立哈希表?
在Linux环境下面我想建立一个哈希表,哈希表的key值是一个int型数组;哈希表的value是一个结构。 创建的时候,首先是GHashTable * G。然后使用创建的库函数: ``` g_hash_table_new(G, g_?_hash, g_?_equal) ``` 我现在就是有点不明白,我的key值是int型的数组,那么我第一个问好处应该用哈希函数?例如如何key是int型的,就直接用库函数: ``` g_int_hash ``` 假设我的value是int型,那么我只需要在第二个“?"处填上int就可以了: ``` g_int_equal ``` 这个函数也是Linux自带的。那现在我的value是struct,我应该用什么函数? 如果要自己写的话,大致思路是什么啊?
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
实战:如何通过python requests库写一个抓取小网站图片的小爬虫
有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来! 首先,准备一个珍藏的小网站,然后就可以开始啦! 第一步 我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片区 图片区内有标题页,一个标题里有10张照片大概 所以步骤是: 第一步:进入图片区的标题页 def getH...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c#中dns类 c#合并的excel c# implicit c#怎么保留3个小数点 c# 串口通信、 网络调试助手c# c# 泛型比较大小 c#解压分卷问题 c#启动居中 c# 逻辑或运算符
立即提问