zoukankan      html  css  js  c++  java
  • 逻辑思维编程

    题目:

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    //从右上角开始查找target元素
        public boolean find(int [][]array, int target){
            //首先判断数组不为空,否则直接返回false
            if(array!=null && array.length > 0 && array[0].length > 0){
                int row = 0; //初始化行的值
                int col = array[0].length - 1; //初始化列的值
                //循环遍历判断,寻找target
                while(row <= array.length-1 && col >= 0){
                    if(target == array[row][col]){
                        return true;
                    }else if(target < array[row][col]){
                        col--;
                    }else{
                        row++;
                    }
                }
            }
            return false;
        }

    题目

    一个链表中包含环,请找出该链表的环的入口结点

    public ListNode EntryNodeOfLoop2(ListNode pHead){
            ListNode fast = pHead;
            ListNode slow = pHead;
            while(fast != null && fast.next != null){
                fast = fast.next.next;
                slow = slow.next;
                //当快指针 与 慢指针相遇时
                if(fast == slow){
                    fast = pHead;
                    //再次相遇
                    while(fast != slow){
                        fast = fast.next;
                        slow = slow.next;
                    }
                    return fast;
                }
            }
            return null;
        }

    题目

    输入一个链表,反转链表后,输出新链表的表头。
    public Node reverse(Node node) {
        Node prev = null;
        Node now = node;
        while (now != null) {
          Node next = now.next;
          now.next = prev;
          prev = now;
          now = next;
        }
    
        return prev;
      }

     题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

    public int  MoreThanHalfNum_Solution1(int [] array){
            HashMap<Integer,Integer> map=new HashMap<>();
            for(int i=0;i<array.length;i++){
                if(!map.containsKey(array[i])){
                    map.put(array[i],1);
                }else{
                    int count=map.get(array[i]);
                    map.put(array[i],++count);
                }
                int time=map.get(array[i]);
                if(time>array.length>>1)
                    return array[i];
            }
            return 0;
    }
    
    public int  MoreThanHalfNum_Solution2(int [] array){
            if(array.length<=0)  return 0;
            int result=array[0];
            int count=1;
            for(int i=1;i<array.length;i++){
                if(array[i]==result){
                    count++;
                }else{
                    count--;
                }
                if(count==0){
                    result=array[i];
                    count=1;
                }
            }
            int time=0;
            for(int i=0;i<array.length;i++){
                if(array[i]==result){
                    time++;
                }
            }
            if(time>array.length/2){
                return result;
            }else{
                return 0;
            }
        }

    题目描述

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

     public int Add(int num1,int num2) {
            while (num2!=0) {
                int temp = num1^num2;
                num2 = (num1&num2)<<1;
                num1 = temp;
            }
            return num1;
        }

    题目描述

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。
     public String replaceSpace(StringBuffer str) {
              String str1=str.toString();  
              String str2=str1.replace(" ","%20");  
              return str2;  
    
        }
    public String replaceSpace(StringBuffer str) {
            int spacenum = 0;
            for(int i=0;i<str.length();i++)
            {
            if(str.charAt(i)==' ')
                spacenum++;
            }
             int indexold = str.length()-1;
             int newlength = str.length()+spacenum*2;
             int indexnew = newlength-1;
             str.setLength(newlength);
             for(;indexold>=0 && indexold<newlength;indexold--)
             {
               if(str.charAt(indexold) == ' ')
               {
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
               }
               else
                    {
                    str.setCharAt(indexnew--, str.charAt(indexold));
                    }
              }
               return str.toString();
        }

    题目描述

    输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
    public static ArrayList<Integer> printListFromTailToHead_Stack(ListNode node)
        {
            if(node==null){
                return null;
            }
            ArrayList<Integer> list=new ArrayList<Integer>();
            Stack<Integer> s=new Stack<Integer>();
            ListNode temp=node;
            while(temp!=null){
                s.push(temp.val);
                temp=temp.next;
            }
            while(!s.empty()){
                list.add(s.pop());
            }
            return  list;
        }

    题目描述

    用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
    Stack<Integer> stack1 = new Stack<Integer>();
       Stack<Integer> stack2 = new Stack<Integer>();
       
    //入栈函数
       public void push(int num) {
           stack1.push(num);    //要往栈中压入什么就直接用栈的push方法就好了      
        }
       
    //出栈函数
       public int pop() {
       Integer re=null; 
           if(!stack2.empty()){  // 如果栈2不是空的,那么把最上面那个取出来
               re=stack2.pop(); 
           }else{ 
                   //如果栈2是空的,就把栈1里的数一个个取出来,放到栈2里
               while(!stack1.empty()){   
                    re=stack1.pop(); 
                    stack2.push(re); 
                                 } 
                      //栈2里有数之后,再次把里面的数取出来
                      if(!stack2.empty()){ 
                             re=stack2.pop(); 
                       } 
           } 
           return re; 

    题目描述

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
    /*
    public class ListNode {
        int val;
        ListNode next = null;
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode Merge(ListNode list1,ListNode list2) {
           if(list1==null)return list2; //判断到某个链表为空就返回另一个链表。如果两个链表都为空呢?没关系,这时候随便返回哪个链表,不也是空的吗?
           if(list2==null)return list1;
           ListNode list0=null;//定义一个链表作为返回值
           if(list1.val<list2.val){//判断此时的值,如果list1比较小,就先把list1赋值给list0,反之亦然
               list0=list1;
               list0.next=Merge(list1.next, list2);//做递归,求链表的下一跳的值
           }else{
               list0=list2;
               list0.next=Merge(list1, list2.next);
           }
           return list0;
        }
    }
    public ListNode Merge(ListNode list1,ListNode list2) {
            if(list1 == null)
                    return list2;
                if(list2 == null )
                    return list1;
                 ListNode tmp1 = list1;
                ListNode tmp2 = list2;
                ListNode head = new ListNode(0);//这里不能把返回链表赋值为null,因为下一行马上就要把它赋值给另一链表,得让它在内存里有位置才行
                ListNode headptr = head;
                while(tmp1 != null && tmp2!=null){             
                       
                        if(tmp1.val <= tmp2.val)
                        {
                            head.next=tmp1;
                            head = head.next;
                            tmp1 = tmp1.next;
                        }else{
                            head.next=tmp2;
                            head = head.next;
                            tmp2=tmp2.next;
                        }
                         
                }
                 //其中一个链表已经跑到头之后,继续单链表的合并
                while(tmp1 != null){
                    head.next = tmp1;
                    head = head.next;
                    tmp1= tmp1.next;
                }
                while(tmp2 != null){
                    head.next = tmp2;
                    head = head.next;
                    tmp2= tmp2.next;
                }
                head = headptr.next;
                return head;
                 
           }
                 
    
    
    
    
    

    题目描述

    输入一个链表,输出该链表中倒数第k个结点。
        public ListNode FindKthToTail(ListNode head,int k) {
               if(head==null||k<=0){
                return null;
            }
           
            ListNode last=head;       
            for(int i=1;i<k;i++){
                if(head.next!=null){
                    head=head.next;
                }else{
                    return null;
                }
            }
            while(head.next!=null){
                head = head.next;
                last=last.next;
            }
            return last;
            

    题目描述

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    public class Solution {
        public void reOrderArray(int [] array) {
            int length = array.length;
            int count = 0;
            if(length == 0){
                return;
            }
            for(int i = 0; i < length; i++){
                if(array[i] % 2 != 0){
                    count++;
                }
            }
            int[] temp = new int[length];
            int a = 0;
            int b = count;
            for(int j= 0; j < length; j ++){
                if(array[j] % 2 == 0){
                    temp[b++] = array[j];
                }else{
                    temp[a++] = array[j];
                }
            }
            for(int i = 0; i < length; i ++){
                array[i] = temp[i];
            }
        }
    public void reOrderArray(int [] array) {
            int length = array.length;
            for(int i = 0; i < length; i ++){
                for(int j = length - 1; j > 0; j --){
                    if(array[j] % 2 == 1 && array[j - 1] % 2 == 0){
                        int temp = array[j];
                        array[j] = array[j - 1];
                        array[j - 1] = temp;
                    }
                }
            }
        }

    题目:

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:

    public ArrayList<Integer> printMatrixClockwisely(int [][]nums){
        ArrayList<Integer> list = new ArrayList<Integer>();
        int rows = nums.length;
        int cols = nums[0].length;
        if(nums == null || cols <= 0 || rows <= 0){
            return null;
        }
        int start = 0;
        while(cols > start*2 && rows > start*2){
            printMatrixInCircle(list, nums, cols, rows, start);
            ++start;
        }
        return list;
    }
    private void printMatrixInCircle(ArrayList<Integer> list, int[][] nums,
            int cols, int rows, int start) {
        int endX = cols - 1 - start;
        int endY = rows - 1 - start;
            
        //从左到右打印一行
        for (int i = start; i <= endX; ++i) {
            int number = nums[start][i];
            list.add(number);
        }
        //从上到下打印一列
        if(start < endY){
            for (int i = start + 1; i <= endY; ++i) {
                int number = nums[i][endX];
                list.add(number);
            }
        }
        //从右向左打印一行
        if(start < endX && start < endY){
            for (int i = endX-1; i >= start; --i) {
                int number = nums[endY][i];
                list.add(number);
            }
        }
        //从下向上打印一列
        if(start < endX && start < endY - 1){
            for (int i = endY-1; i >= start + 1; --i) {
                int number = nums[i][start];
                list.add(number);
            }
        }
    }

     题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。

    public int count(int n){
        if(n<1)
            return 0;
        int count = 0;
        int base = 1;
        int round = n;
        while(round>0){
            int weight = round%10;
            round/=10;
            count += round*base;
            if(weight==1)
                count+=(n%base)+1;
            else if(weight>1)
                count+=base;
            base*=10;
        }
        return count;
    }

    题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

    import java.util.Stack;
     
    public class Solution {
        Stack<Integer> stack = new Stack<>();
        Stack<Integer> minStack = new Stack<>();
     
        public void push(int node) {
            stack.push(node);
            if (minStack.isEmpty()) {
                minStack.push(node);
            } else {
                minStack.push(Math.min(node, minStack.peek()));
            }
        }
     
        public void pop() {
            if (!stack.isEmpty()) {
                stack.pop();
                minStack.pop();
            }
        }
     
        public int top() {
            return stack.peek();
        }
     
        public int min() {
            if (minStack.isEmpty())
                return Integer.MIN_VALUE;
            return minStack.peek();
        }
    }

    题目:

    给定一浮点数base和int类型的整数exponent。求base的exponent次方

    public class Solution {
        public double Power(double base, int exponent) {
            // 当底数为0,指数为负数时,则抛出异常或者返回0.0
            if (equal(base, 0) && exponent < 0) {
                return 0.0;
            }
     
            // 先对指数进行取绝对值计算
            int absExponent = Math.abs(exponent);
            double result = powerWithExponent(base, absExponent);
     
            // 判断如果传入的指数是负数,进行取反,否则直接返回
            if (exponent < 0) {
                result = 1.0 / result;
            }
            return result;
      }
         
        // 计算数值的整数次方
        public double powerWithExponent(double base, int absExponent) {
            double result = 1.0;
            for (int i = 1; i <= absExponent; ++i) {
                result *= base;
            }
            return result;
        }
         
        // 判断两个double类型的数值是否相等
        public boolean equal(double num1, double num2) {
            if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) {
                return true;
            } else
                return false;
        }
         
    }

     题目: 
    统计一个数字在排序数组中出现的次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现的次数就是3。

    public int getFirstK(int[] data,int k,int start,int end){
        while(start<=end){
            int mid=start+((end-start)>>1);
            if(data[mid]==k){
                if((mid>0 && data[mid-1]!=k) || mid==0)
                    return mid;
                else
                    end=mid-1;
            }
            else if(data[mid]>k)
                end=mid-1;
            else
                start=mid+1;
        }
        return -1;
    }
     
    public int getLastK(int[] data,int length,int k,int start,int end){
        while(start<=end){
            int mid=start+((end-start)>>1);
            if(data[mid]==k){
                if((mid<length-1 && data[mid+1]!=k) || mid==length-1)
                    return mid;
                else
                    start=mid+1;
            }
            else if(data[mid]<k)
                start=mid+1;
            else
                end=mid-1;
        }
        return -1;
    }
     
    public int getNumberOfK(int[] data,int length,int k){
        if(data==null || length<=0)
            return 0;
        int first=getFirstK(data,k,0,length-1);
        int last=getLastK(data,length,k,0,length-1);
        if(first!=-1 && last!=-1)
            return last-first+1;
        return 0;
    }

     题目:第一个只出现一次的字符

    public Character firstNotRepeating(String str){
            if(str == null)
                return null;
            char[] strChar = str.toCharArray();
            LinkedHashMap<Character,Integer> hash = new LinkedHashMap<Character,Integer>();
            for(char item:strChar){
                if(hash.containsKey(item))
                    hash.put(item, hash.get(item)+1);
                else
                    hash.put(item, 1);
            }
            for(char key:hash.keySet())
            {
                if(hash.get(key)== 1)
                    return key;
            }
            return null;

    题目:

    我们把只包含因子2,3和5的数称为丑数(Ugly Number),求从小到大的顺序第n的丑数,例如6,8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第1个丑数

    public int GetUglyNumber_Solution(int index) {
            if(index==0)
                return 0;
            int[] a = new int[index];
            int count = 1;
            a[0] = 1;
            int index2 = 0;
            int index3 = 0;
            int index5 = 0;
            while(count<index){
                int min = min(a[index2]*2,a[index3]*3,a[index5]*5);
                a[count] = min;
                while(a[index2]*2<=a[count]) index2++;
                while(a[index3]*3<=a[count]) index3++;
                while(a[index5]*5<=a[count]) index5++;
                count++;
            }
            int result = a[index-1];
            return result;
        }
    
        public int min(int a,int b,int c){
            int temp = a>b?b:a;
            return temp>c?c:temp;
        }

     【题目描述】在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

    public boolean duplicate(int numbers[],int length,int [] duplication) {
            boolean flag = false;
            if(numbers==null || length==0){
                return flag;
            }
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            for(int num: numbers){
                if(map.containsKey(num)){
                    flag = true;
                    duplication[0] = num;
                    break;
                }
                map.put(num, 0);
            }
            return flag;
        }
    public boolean duplicate(int numbers[],int length,int [] duplication) {
            boolean flag = false;
            if(numbers==null || length==0){
                return flag;
            }
            for(int i=0; i<length; i++){
                int index = numbers[i];
                if (index < 0){
                    index += length;
                }              
                if(numbers[index] < 0){
                    //因为index<0时,有一个还原+length的操作,所以返回的就是原来的重复的数字
                    duplication[0] = index;   
                    flag = true;
                    break;        
                }              
                numbers[index] -= length;       
            }
            return flag;
        }

     题目:旋转数组的最小数字

    import java.util.ArrayList;
    public class Solution {
        public int minNumberInRotateArray(int [] array) 
        {
              if(array == null || array.length == 0)
           {
               return 0;
           }
           int p1 = 0;//从前往后走
           int p2 = array.length-1;//从后往前走
           int min = array[p1];//如果没发生旋转,直接将array[0]的值返回,
           int mid = 0;
           //当数组发生旋转了,
           while(array[p1] >= array[p2])
           {
               //当两个指针走到挨着的位置时,p2就是最小数了
               if(p2 - p1 == 1)
               {
                   min = array[p2];
                   break;
               }
               mid = (p1 + p2)/2; 
               //如果中间位置的数既等于p1位置的数又等于P2位置的数
               if(array[p1] == array[mid]&&array[p2]==array[mid])
               {
                  min = minInorder(array,p1,p2);
               }
             if(array[p1] <= array[mid])//若中间位置的数位于数组1,让p1走到mid的位置
             {
                 p1 = mid;
             }
             else if(array[p2] >= array[mid])//若中间位置的数位于数组2,让p2走到mid的位置
             {
                 p2 = mid;
             }
           }
           return min;
       }
       private int minInorder(int[]array,int p1,int p2)
       {
           int min = array[p1];
           for (int i = p1 + 1; i <= p2; i++)
        {
            if(min > array[i])
            {
                min = array[i];
            }
        }
           return min;
       }
        
    }

    获取Activity视图层级的最大深度

    public static int getViewHierarchyMaxDeep(Activity activity) {
        View decorView = activity.getWindow().getDecorView();
        int height = getDeep(decorView, 1);
        Log.e("TAG", activity.getClass().getSimpleName() + " height is:" + height);
        return height;
    }
    
    // curr为当前View的层级
    private static int getDeep(View view, int curr) {
        if (view instanceof ViewGroup) {
            ViewGroup parent = (ViewGroup) view;
            int childCount = parent.getChildCount();
            if (childCount > 0) {
                // 层级+1
                int max = curr + 1;
                for (int i = 0; i < childCount; i++) {
                    View child = parent.getChildAt(i);
                    int height = getDeep(child, curr + 1);
                    if (max < height) {
                        max = height;
                    }
                }
                return max;
            } else {
                return curr;
            }
        } else {
            return curr;
        }
    }

    连续子数组的最大和

    public static int FindGreatestSumOfSubArray(int[] array) {
             if (array.length==0 || array==null) {
                 return 0;
             }
            int currentSum = 0;     //存储当前连续n项的和
            int max = 0;            //存储连续子元素和的最大值
            for (int i = 0; i < array.length; i++) {
                //核心部分,好好理解.
                if(currentSum<=0){      //如过当前连续n项的和小于等于0,则没必要与后面的元素相加
                    currentSum = array[i];      //currentSum重新赋值
                }else{
                    currentSum += array[i];     //如果currentSum的值大于0,则继续与后面的元素相加,
                }
                if(currentSum>max){         //每次改变currentSum的值都有与max进行比较
                    max = currentSum;       //如果currentSum的值大于max,则将currentSum的值赋值给max
                }
            }
            return max;
         }  

    孩子们的游戏(圆圈中最后剩下的数)

    public class Solution {
        public int LastRemaining_Solution(int n, int m) {
            if(n<1||m<1) return -1;
            int[] array = new int[n];
            int i = -1,step = 0, count = n;
            while(count>0){
                i++;
                if(array[i%n] == -1) continue;
                step++;
                if(step==m) {
                    array[i%n]=-1;
                    step = 0;
                    count--;
                }
            }
            return i%n;
        }
    }
  • 相关阅读:
    mysql集群架构
    mysql数据库版本不同所引起的问题
    linux下mysql安装
    windows下mysql的安装
    JMeter操作mysql
    Tomcat 配置下载服务器
    JMeter接口测试——关联
    JMeter接口测试——断言
    JMeter接口测试——参数化(从文件中读取参数)
    JMeter接口测试示例(三)——添加HTTP认证
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9573991.html
Copyright © 2011-2022 走看看