四个不同重量砝码可以称出多种重量

最近疫情在家没法出门,因此尝试去找找工作,投递了一些大厂的职位,也有一些好心猎头帮我推荐。但是实在是不好意思,一面都过不了。 不过我似乎也没有太大期待了。毕竟这玩意对于我来说,还是看运气啦,只是纯当找个人说说话,顺便还能聊聊看自己如果找工作还有哪些不足。

其中腾讯音乐前天打电话面试,最后问了我一个算法问题,四个砝码可以称出多少种重量。

我当时听到砝码这两个字竟然没有反应过来,还问了下砝码是什么,天平上那个吗?感觉几百年没有听到过这个词了,有点懵逼。面试的让我说思路,我想这不就是一个数学题吗?排列组合想了一下,但转念一想 他没告诉我重量,我怎么知道可以称出多少种重量呢? 比如 2,4,6,8 可以用2和4 称出6,也可以用一个6 称出6 呀。那这算一种吗?好像还不对,我还可以用 一个2 称出一个二,用一个4,和6 ,把物品放在4的那一边称出一个二的重量来呀。我靠,这事情太复杂了。然后就乱了。最后挂断电话,面试结束。

Continue reading “四个不同重量砝码可以称出多种重量”

HashMap的实现原理

接着昨天的问题

-HashMap 用的多吗?
– 嗯挺多的
– 能说说其原理吗?
– HashMap 是一种数据结构,我们可以通过Key 来存储一些value。 利用Key的HashCode 做为内存地址,以便于很快的查找到对应的Value。
– 什么内存地址?
– 就是java虚拟机中的内存啊,不知道是堆还是栈
– 啊???(心里活动:妈勒个蛋,一本正经的胡说八道)好我们不说这个,那你说到HashCode ,请问HashCode 有可能发生碰撞吗?
– 当然会(hashCode 返回的也就是int 行,最多也就是2的32次方个。总是有限的嘛,而我们的对象可以无限制创建,虽然我还没有对象)
– 那HashMap是如何解决这个问题的呢。
– 额,这个几率会很小吧,可能需要我们重写一下key的hashCode,因为Key 也是Object类的子类吧。所以可以重写,额。。。
– 。。。。

承认,没看过HashMap 源码,我的错。我应该直接说没看过的。尴尬。
那今天来具体看一下 。
说点简单的,HashMap 怎么存储我们的 Key Value,从put 方法开始跟踪。

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

一个hash 函数。(这个有兴趣可以再看看是怎么算的,我写完这个再去看看) 算出了Hash.
Continue reading “HashMap的实现原理”

反转单向链表

嗯,首先,说一件小事,昨天还在犹豫盒子支付还是海泰康,今天盒子支付经理给我回电话了,说他们也同样能达到海泰康给出的薪资。确实挺欣慰的。能力能够得到公司的认可,说明在深圳,真的是凭能力说话。话说昨天的一道笔试题,用c++实现单项链表的反转链表。我已经快3年没有写过c++了,写的一塌糊涂,不是思想不会而是语法几乎忘记了。
想到这个问题,我立马想到的一个思路就是遍历链表,用一个指针指向最尾节点,然后重新遍历,从第一个节点开始,将每一个节点插入最后一个节点末位。
步骤如下:
12345
23451
34521
45321
54321
今天没事实现了下(写了这么久的java,忽然转到写c++很不习惯,呵呵)

#include<iostream>
#include<set>
using
	namespace std;
struct	node{
	int data;
	 node *next;
};

//找到最后一个节点
node* findlast(node *head){
	while(head->next){
		head=head->next;
	}
	return	head;

}
//把目标结点插入到最后一个节点后面
void insert(node *aim,node * last){
	if(aim==NULL){return;}
	if(NULL==last->next){
		last->next=aim;
		aim->next=NULL;
	}else{
		node *temp=last->next;
		last->next=aim;
		aim->next=temp;
	}
}

//反转函数
void reverse(node *head){
	node *last=findlast(head);
	while(head!=last){
		node *temp=head->next;
		insert(head,last);
		head=temp;
	}
	cout<<head->data;
}

int main(){
	node *nd=NULL,*head=NULL;	
	for(int i=0;i<5;i++)
	{
		node *temp=(node *)malloc(sizeof(node));
		temp->data=i;
		temp->next=NULL;
		if(NULL!=nd){
		   nd->next=temp;
		   nd=temp;
		} else{
		   head=nd=temp;
		}	 
 	}

	reverse(head);
	system("pause");
return 0;
}

设计模式入门

策略模式:

设计模式原则一:

把问题归零,找出应用中可能需要变化之处,把它们独立出来,不要把它们和那些不需要变化的代码混在一起。

 

设计模式原则二:

针对接口编程,而不是针对实现编程.

就鸭子而言在父类中定义借口定义动作类去实现接口 ,如果要某种动作,创建动作类实现该动作 ,new 那个动作然后 给父类,可以以在子类的构造函数中定义该行为具体方法。 这样保证我让橡皮鸭子可以拥有火箭的动力。如果不想让它拥有火箭动力也可以去掉。

设计模式原则三:

多用组合少用继承,飞行和叫是通过适当的行为和对象组合而来的。别的非duck类的也可以有鸣叫的方法 其实就相当于把 借口当作成员 这是我理解中的委托。

JAVA 上加密算法的实现用例

1 章基础知识

1.1. 单钥密码体制

单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。

通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难。但是加密的安全性依靠密钥保管的安全性 , 在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题,并且如果在多用户的情况下密钥的保管安全性也是一个问题。

单钥密码体制的代表是美国的 DES

Continue reading “JAVA 上加密算法的实现用例”