题目1

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

输入描述:


题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

示例1

输入

1,2,3,4,5,6,7,0

输出

7
public class Solution {
int cnt=0; public int InversePairs(int[] array) {
cnt = 0;
if (array != null)
mergeSortUp2Down(array, 0, array.length - 1);
return cnt;
} public void mergeSortUp2Down(int[] array,int start,int end){
if(start>=end)
return; int mid = (start+end)/2;
mergeSortUp2Down(array,start,mid);
mergeSortUp2Down(array,mid+1,end); sort(array,start,mid,end);
} public void sort(int[] array,int start,int mid,int end){
int p1=start,p2=mid+1,k=0;
int tmp[] = new int[end-start+1];
while(p1<=mid&&p2<=end){
if(array[p1]>array[p2]){
cnt+=mid-p1+1;
cnt%=1000000007;
tmp[k++]=array[p2++];
}else{
tmp[k++]=array[p1++];
}
}
while(p1<=mid)
tmp[k++]=array[p1++];
while(p2<=end)
tmp[k++]=array[p2++]; for(int i=0;i<tmp.length;i++)
array[start++]=tmp[i];
}
}

题目2

题目描述

输入两个链表,找出它们的第一个公共结点。
一种自己的解法(如下,较长)+一种巧妙的解法(第二种,同时出发,走完不同路程的两个人 再走一遍对方走过的路 那么他们就会相遇)
/*
public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null||pHead2==null)
return null;
int length1=0,length2=0;
ListNode node = pHead1;
while(node!=null){
length1++;
node=node.next;
}
node = pHead2;
while(node!=null){
length2++;
node=node.next;
}
ListNode firstGoNode;
int chaValue=length2-length1;
if(chaValue>0){
firstGoNode=pHead2;node=pHead1;
}else{
firstGoNode=pHead1;node=pHead2;
}
if(chaValue<0)///之前少了这个地方!!!因为可能是负数!
chaValue=-chaValue;
while(chaValue>0){
chaValue--;
firstGoNode=firstGoNode.next;
}
while(node!=null&&firstGoNode!=null){
if(node.val==firstGoNode.val)
return node;
firstGoNode=firstGoNode.next;
node=node.next;
}
return null;
}
}
/*
public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1!=p2){
p1 = (p1==null ? pHead2 : p1.next);
p2 = (p2==null ? pHead1 : p2.next);
}
return p1;
}
}

题目3

题目描述

统计一个数字在排序数组中出现的次数。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int minIndex = getMinIndex(array,k);
int maxIndex = getMaxIndex(array,k); return maxIndex-minIndex+1;
}
public int getMinIndex(int [] array , int k) {
int start=0,end=array.length-1;
int mid=(start+end)/2;
while(start<=end){
if(array[mid]<k){
start=mid+1;
}else{
end=mid-1;
}
mid=(start+end)/2;
}
return start;
} public int getMaxIndex(int [] array , int k) {
int start=0,end=array.length-1;
int mid=(start+end)/2;
while(start<=end){
if(array[mid]>k){
end=mid-1;
}else{
start=mid+1;
}
mid=(start+end)/2;
}
return end;
}
}

题目4

题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val; } }
*/
public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null)
return 0; int left = TreeDepth(root.left);
int right = TreeDepth(root.right); return left>right?left+1:right+1; }
}

题目5

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。
public class Solution {

    boolean isBalanced = true;

    public boolean IsBalanced_Solution(TreeNode root) {
getDepth(root);
return isBalanced;
} public int getDepth(TreeNode root) {
if(root==null)
return 0;
int left = getDepth(root.left);
int right = getDepth(root.right);
if(Math.abs(left-right)>1)
{
isBalanced = false;
return 0;//已经不是平衡二叉树没必要继续遍历了
}
return left>right?left+1:right+1;
}
}

题目6

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
       if(array==null ||array.length<2)
           return ;
       int temp = 0;
       for(int i=0;i<array.length;i++)
           temp ^= array[i];
        
       int indexOf1 = findFirstBitIs(temp);
       for(int i=0;i<array.length;i++){
           if(isBit(array[i], indexOf1))
               num1[0]^=array[i];
           else
               num2[0]^=array[i];
       }
   }
   public int findFirstBitIs(int num){
       int indexBit = 0;
       while(((num & 1)==0) && (indexBit)<8*4){
           num = num >> 1;
           ++indexBit;
       }
       return indexBit;
   }
   public boolean isBit(int num,int indexBit){
       num = num >> indexBit;
       return (num & 1) == 1;
   } }

算法学习之剑指offer(七)的更多相关文章

  1. 算法学习之剑指offer(十一)

    一 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. import java.util.*; ...

  2. 算法学习之剑指offer(九)

    一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...

  3. 算法学习之剑指offer(六)

    题目1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.*; public cl ...

  4. 算法学习之剑指offer(五)

    题目1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution ...

  5. 算法学习之剑指offer(四)

    题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...

  6. 算法学习之剑指offer(十二)

    一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

  7. 算法学习之剑指offer(十)

    一 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3 ...

  8. 算法学习之剑指offer(八)

    题目一 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没 ...

  9. 算法学习之剑指offer(三)

    题目1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在 ...

随机推荐

  1. Bootstrap4默认样式不对胃口?教你使用NPM+Webpack+SASS来定制

    Bootstrap 是一个流行的前端样式库,可以方便快速的构建应用,但默认样式可能不尽人意,本文就介绍如何使用 NPM, Webpack, SASS 针对它的源码来定制自己的主题.版本使用的是 Boo ...

  2. Python的6种运算符(日记)

    学习了许久的Python,我单独总结出了Python中比较常见的6种运算符,感觉略有不全,希望大伙可以一起讨论与研究Python! 一.算术运算符 加 减 - 乘 * 除 / 取余 % 取整 // 异 ...

  3. FreeSql (十三)更新数据时忽略列

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  4. Android 开发系列教程之(一)Android基础知识

    什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...

  5. JAVA多线程高并发面试题总结

    ReadMe : 括号里的内容为补充或解释说明. 多线程和高并发是毕业后求职大厂面试中必问的知识点,自己之前总是面试前才去找相关的知识点面试题来背背,隔段时间又忘了,没有沉淀下来,于是自己总结了下相关 ...

  6. 你好,C语言

    对于我来说,C语言就和陌生人一样,对他完全不了解,更不要提什么C++了,这就要我主动和他打招呼,深入认识了解它了哈.目前对于C语言的理解,只知道他的的功强大,能操作硬件,编写各类驱动,强悍的LINUX ...

  7. [Advanced Python] 11 - Implement a Class

    基础概念:[Python] 08 - Classes --> Objects 进阶概念:[Advanced Python] 11 - Implement a Class 参考资源:廖雪峰,面向对 ...

  8. PHP5.6版本在Windows上安装redis扩展

    PHP使用redis扩展 一.php安装redis扩展   1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本       2.根据PHP版本号,编译器版本号和CPU架构, 选择 ...

  9. 修改tomcat 使用的JVM的内存

    一,前言 在文章让tomcat使用指定JDK中,我让tomcat成功使用了我指定的JDK1.8,而不是环境变量中配置的JDK10.本篇文章我们就来探讨一下怎么设置tomcat使用的JVM的内存. 为什 ...

  10. CentOS 8 正式发布

    转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net] 本文地址:https://www.oschina.net/news/110111/centos-8-re ...