Lintcode答案&笔记
1、A+B问题 给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符
思路:作异或得到未进位和,作与并向左移1位得到进位,随后再重复操作俩结果,直到进位为0,适合用递归
public int aplusb(int a, int b) {
int sum = a ^ b;
int ca = (a & b) << 1;
if (ca == 0) {
return sum;
}
return aplusb(sum, ca);
}
2016-12-07
2、尾部的零 设计一个算法,计算出n阶乘中尾部零的个数
思路:有多少个5因子尾部就有多少个0,除以一次5获得包含5的一次方的个数,除以两次5获得包含5的两次方的个数(两次方有两个5因子)...以此直到除以5为0跳出
public long trailingZeros(long n) {
long num = 0;
while (n != 0){
num += n / 5;
n /= 5;
}
return num;
}
2016-12-07
3、统计数字 计算数字k在0到n中的出现的次数,k可能是0~9的一个值
tips:由于k是0~9的值,循环时可在k开始,因为小于k的数不可能含有k
思路1:(强行获得)把所有0到n的数转成字符串,toCharArray()后用字符数组的每一位与k比较(先把每一位字符通过Character.getNumericValue()变回个位整数)
public int digitCounts(int k, int n) {
int num = 0;
for (int i = k; i <= n; i++){
//整数变成字符串
String s = String.valueOf(i);
//字符串变成字符数组
char[] ss = s.toCharArray();
for (int j = 0; j < s.length(); j++){
//字符变成整数
int a = Character.getNumericValue(ss[j]);
if (a == k){
num++;
}
}
}
return num;
}
思路2:(数学方法获得)通过与10的余数得到末位,通过与10除去掉末位,构成一个循环,就可以分析一个数的所有位。然后把所有位都加起来(从局部到整体)
public int digitCounts(int k, int n) {
int cnt = 0;
for (int i = k; i <= n; i++) {
//分次计算每一个数中含有k的个数
cnt += singleCount(i, k);
}
return cnt;
}
public int singleCount(int i, int k) {
//排除0的情况
if (i == 0 && k == 0)
return 1;
int cnt = 0;
while (i > 0) {
//判断末尾是否为k
if (i % 10 == k) {
cnt++;
}
//去掉末尾再次循环,直到去除完所有位跳出循环
i = i / 10;
}
return cnt;
}
2016-12-08
4、丑数II 设计一个算法,找出只含素因子2,3,5的第n大的数
思路1:(时间复杂度为O(n))ArrayList动态数组保存每个满足条件的数,用三个指针遍历之前的数,分别与2,3,5相乘,得到相乘后能够比数组中的上一个数大的位置,最后把这三个指针所得结果的最小值加入数组中
public int nthUglyNumber(int n){
List<Integer> uglys = new ArrayList<Integer>(); //创建整形动态数组;
uglys.add(1); //把特殊值1首先加入; //分别代表了与2、3、5相乘元素的序号,相当于指针;
int p2 = 0, p3 = 0, p5 = 0; //用前面各个位置的数与2,3,5相乘直到比上一个数大,并获得相应位置;
for (int i = 0; i <= n - 2; i++){
//获取数组中上一个元素,第n个数的上一个对应下标为n-2;
int lastNumber = uglys.get(i);
while (uglys.get(p2) * 2 <= lastNumber) p2++;
while (uglys.get(p3) * 3 <= lastNumber) p3++;
while (uglys.get(p5) * 5 <= lastNumber) p5++; //对比p2,p3,p5位置上分别与2,3,5相乘的结果,最小值添加为下一元素;
uglys.add(Math.min(Math.min(uglys.get(p2) * 2, uglys.get(p3) * 3), uglys.get(p5) * 5));
}
return uglys.get(n - 1);
}
思路2:(时间复杂度为O(nlogn))Map来做,还没看懂答案
2016-12-08
5、在数组中找出第k大元素
思路:利用快排思想,切分位置和k对应就是第k大(由于快排是从小到大,所以对k进行转换)
warm:好好理解切分思想和递归思想
public int kthLargestElement(int k, int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
if (k <= 0) {
return 0;
}
//使用快速排序,两指针为头尾,从小到大排序,需要转换第几大
return helper(nums, 0, nums.length - 1, nums.length - k + 1);
}
public int helper(int[] nums, int l, int r, int k) {
if (l == r) {
return nums[l];
}
//循环切分,直到找到第k大的数,不满足就递归
int position = partition(nums, l, r);
if (position == k - 1) {
return nums[position];
} else if (position < k - 1) {
return helper(nums, position + 1, r, k);
} else {
return helper(nums, l, position - 1, k);
}
}
public int partition(int[] nums, int l, int r) {
//初始化左右指针,定义切分元素
int left = l;
int right = r;
int pivot = nums[left];
//进行切分,右边元素小于pivot时赋给左边,否则移动
while (left < right) {
while (left < right && nums[right] >= pivot) {
right--;
}
//第一次循环时切分元素原位置上的数被取代
nums[left] = nums[right];
while (left < right && nums[left] <= pivot) {
left++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
2016-12-15
6、合并两个排序的整数数组A和B变成一个新的数组
思路:先把两个数组都不溢出的情况考虑完,再判断哪一个溢出,一个溢出则另一个肯定不溢出
public int[] mergeSortedArray(int[] A, int[] B) {
int m = A.length;
int n = B.length;
int[] C = new int[m + n];
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (A[i] < B[j]) {
C[k++] = A[i++];
} else {
C[k++] = B[j++];
}
}
while (i < m) {
C[k++] = A[i++];
}
while (j < n) {
C[k++] = B[j++];
}
return C;
}
2016-12-15
Lintcode答案&笔记的更多相关文章
- WebService使用JSON格式传递笔记+JQuery测试
原文WebService使用JSON格式传递笔记+JQuery测试 因为一些因素,必须改写WebService,很传统,但是很多公司还在用.. 因为XML 的关系,不想让他传递数据的时候过度肥大,所以 ...
- UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)
首先将本节主要内容记录下来.然后给出课后习题的答案. 笔记: :首先我想推导用SVD求解PCA的合理性. PCA原理:如果样本数据X∈Rm×n.当中m是样本数量,n是样本的维数.PCA降维的目的就是为 ...
- 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案
国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...
- lintcode刷题笔记(一)
最近开始刷lintcode,记录下自己的答案,数字即为lintcode题目号,语言为python3,坚持日拱一卒吧... (一). 回文字符窜问题(Palindrome problem) 627. L ...
- 《C++Primer》第五版习题答案--第三章【学习笔记】
[C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...
- 《C++Primer》第五版习题答案--第五章【学习笔记】
<C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...
- 《C++Primer》第五版习题答案--第六章【学习笔记】
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...
- LintCode笔记 - 8. 旋转字符串
这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 旋转字符串 中文English 给定一个字符 ...
随机推荐
- sqlserver 乐观并发模式
一开始不怎么理解乐观并发模式是什么. 这种模式可以在死锁问题上使用. 在sql中 这样就是乐观并发模式. SqlServer默认开启的是悲观并发模式 例如:
- C# if中连续几个条件判断
C# if中连续几个条件判断 1.if (条件表达式1 && 条件表达式2) 当条件表达式1为true时 using System; using System.Collections. ...
- python学习笔记1:python入门
关于版本的选择 按照网上的说法,如果python是为了在工作中使用,选择2.7版本的.这里我选择2.7.9版本的来进行学习: Python是什么? 是一种高级的计算机程序设计语言.应用范围比较广,go ...
- 转载:TypeScript 简介与《TypeScript 中文入门教程》
简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...
- 企业IT架构介绍
企业信息化之路 问题 互联互通 统一访问 统一身份管理 数据管理模型 企业数据集成业务架构 业务流程框架 业务流程模型 个性流程支持 跨业务的业务流程组合 EBS总线 ] SOA架构上视图 B ...
- 高效 Java Web 开发框架 JessMA v3.4.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- CSS3 border-radius 圆角属性
使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. -webkit- 或 -moz- ...
- JQ的表单验证
(function () { $("#but").click(function () { if ($("#name").val() == "" ...
- css3 transition属性
最近打算学习css3知识,觉得css3写出来的效果好炫好酷,之前一直想要学习来着.可能之前的决心,毅力,耐心不够,所以想要重整起来,放下浮躁的心态,一步一个脚印,踏踏实实的来学习. 首先学习的是css ...
- SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发
端口转发: 设置>网络>端口转发 端口转发: 子系统地址通过在Linux系统总使用ifconfig查看: 还需要在linux主机上安装sshd sudo apt-get insta ...