LintCode算法题解——奇偶分割数组、二进制中1个数、反转整数、加一、排序数组转换为高度最小的二叉搜索树、二进制求和
来源:互联网 发布:requirejs 后盾网源码 编辑:程序博客网 时间:2024/05/18 01:43
奇偶分割数组
分割一个整数数组,使得奇数在前偶数在后。
样例
给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]。
算法
这题还是比较简单的,方法很多很多,我们将数组循环遍历,将遍历中的偶数和奇数相互交换就ok了。
public class Solution {/* * @param nums: an array of integers * @return: nothing */ public void partitionArray(int[] nums) { // write your code here int length = nums.length; int temp = 0; int index = 0; if(length==0) return; for(int i=0;i<length;i++){ if(nums[i]%2==0){ index = i; while(nums[index]%2==0){ if(index!=length-1) index=index+1; else break; } temp = nums[i]; nums[i] = nums[index]; nums[index] = temp; } } }}
二进制中1个数
计算在一个 32 位的整数的二进制表示中有多少个 1.
样例
给定 32 (100000),返回 1
给定 5 (101),返回 2
给定 1023 (111111111),返回 9
算法
按与计算
1&1==1,1&0==0,0&&0==0;下面是很巧妙的一个方法。
public class Solution {/* * @param num: An integer * @return: An integer */ public int countOnes(int num) { // write your code here int count = 0; while(num!=0){ num = num & (num-1); count++; } return count; }}
反转整数
将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。
样例
给定 x = 123,返回 321
给定 x = -123,返回 -321
算法
反转很简单,难点在于颠倒后证书溢出判断,int32位范围是-2^31~2^31-1,这里使用temp/10与reversed_n进行判断,当temp溢出时,/10不等于reversed_n,所以可判断溢出成立。
public class Solution { /* * @param n: the integer to be reversed * @return: the reversed integer */ public int reverseInteger(int n) { // Write your code here int reversed_n = 0; while (n != 0) { int temp = reversed_n * 10 + n % 10; n = n / 10; if (temp / 10 != reversed_n) { reversed_n = 0; break; } reversed_n = temp; } return reversed_n; }}
加一
给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。
该数字按照大小进行排列,最大的数在列表的最前面。
样例
给定 [1,2,3] 表示 123, 返回 [1,2,4].
给定 [9,9,9] 表示 999, 返回 [1,0,0,0].
算法
google的题,哪道没有陷阱,第一次被坑了。
注意不要把数组转为int型整数,因为不确定数组大小会导致溢出。
本题思想是,若数组值都为9,则增加数组length,首位设为1,其他位为0;否则,末位加1,结束返回。
public class Solution { /* * @param digits: a number represented as an array of digits * @return: the result */ public static int[] plusOne(int[] digits) { // write your code here boolean index = true; for(int n=0; n<digits.length;n++){ if(digits[n]!=9) index = false; } if(index==true){ int[] num = new int[digits.length+1]; num[0] = 1; for(int m=1;m<digits.length+1;m++) num[m] = 0; return num; } for(int i=digits.length-1;i>=0;i--){ if(digits[i]!=9){ digits[i] = digits[i]+1; break; }else{ digits[i] = 0; } } return digits; }}
把排序数组转换为高度最小的二叉搜索树
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
样例
给出数组 [1,2,3,4,5,6,7], 返回
4 / \ 2 6 / \ / \ 1 3 5 7
算法
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution(){ /** * @param nums: an integer array * @return: a tree node */ public TreeNode sortArrayToBST(int[] A){ if(A==null) return null; return bulidTree(A, 0, A.length-1); } public void buildTree(int[] A, int start, int end){ if(start>end) return null; int middle = (start+end)/2; TreeNode root = new TreeNode(A[middle]); A.left = buildTree(A, start, middle-1); A.right = buildTree(A, middle+1, end); }}
二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
样例
a = 11
b = 1
返回 100
算法
这种题千万不要将二进制转化为整数,这样转化复杂度将提高几何倍数。
注意如果相应位相加结果为2(1+1),则结果设为1,这时要设一个哨兵,相应位溢出时,哨兵设为1;结果为3(1+1+哨兵)时,相同道理。
public class Solution { /* * @param a: a number * @param b: a number * @return: the result */ public String addBinary(String a, String b) { // write your code here if(b.length()==0&&a.length()==0) return null; String str = ""; int index = 0; int i = 0; int middle = 0; String[] A = a.split(""); String[] B = b.split(""); while(i<A.length||i<B.length) { if (i >= A.length && i < B.length) middle = Integer.valueOf(B[B.length-1-i]) + index; else if (i >= B.length && i < A.length) middle = Integer.valueOf(A[A.length-1-i]) + index; else if (i < A.length && i < B.length) middle = Integer.valueOf(A[A.length-1-i]) + Integer.valueOf(B[B.length-1-i]) + index; if (middle == 3) { str = 1 + str; index = 1; //i=i+1; } else if (middle == 2) { str = 0 + str; index = 1; } else if (middle == 0 || middle == 1) { str = middle + str; index = 0; } i = i + 1; } if(index==1) str = index+str; return str; }}
- LintCode算法题解——奇偶分割数组、二进制中1个数、反转整数、加一、排序数组转换为高度最小的二叉搜索树、二进制求和
- lintCode(177)——把排序数组转换为高度最小的二叉搜索树
- lintcode——把排序数组转换为高度最小的二叉搜索树
- LintCode SortedArrayToBST 把排序数组转换为高度最小的二叉搜索树
- lintcode-把排序数组转换为高度最小的二叉搜索树-177
- 把排序数组转换为高度最小的二叉搜索树(LintCode)
- LintCode:把排序数组转换为高度最小的二叉搜索树
- LintCode:把排序数组转换为高度最小的二叉搜索树
- lintcode,把排序数组转换为高度最小的二叉搜索树
- LintCode | 177. 把排序数组转换为高度最小的二叉搜索树
- LintCode 把排序数组转换为高度最小的二叉搜索树
- 把排序数组转换为高度最小的二叉搜索树-LintCode
- lintcode把排序数组转换为高度最小的二叉搜索树
- LintCode-把排序数组转换为高度最小的二叉搜索树
- lintcode 把排序数组转换为高度最小的二叉搜索树
- LintCode 把排序数组转换为高度最小的二叉搜索树
- LintCode 177-把排序数组转换为高度最小的二叉搜索树
- 把排序数组转换为高度最小的二叉搜索树-LintCode
- 随机生成验证码
- E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
- 【金融财经】金融市场一周简报(2017-09-15)
- 11g RAC INSTALL 准备工作part2
- java面试基础问题 整合
- LintCode算法题解——奇偶分割数组、二进制中1个数、反转整数、加一、排序数组转换为高度最小的二叉搜索树、二进制求和
- React学习
- leetcode 151. Reverse Words in a String 字符串分割逆序
- [Flink--计算引擎]--第三代计算引擎--Flink
- jsp 将表格以Excel形式导出方法之一(不用导包)
- NOIP 2017.9.17 总结+心得
- lucene.net查询条件
- linux 常用指令
- 吐槽CSDN--想钱想疯了--推荐文章里面广告博文去不掉