• 算法学习之剑指offer(八)


    题目一

    题目描述

    小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

    输出描述:

    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
            ArrayList<ArrayList<Integer> > resultList = new ArrayList<ArrayList<Integer> >();
            
            if(sum<=2)
                return resultList;
            
            for(int n=sum-1;n>=1;n--)
            {
                ArrayList<Integer> list = new ArrayList<Integer>();
                int on=2*sum-n*(n+1);
                int lower = 2*(n+1);
                int startNum=on/lower;
                
                if(startNum>0&&(startNum*(n+1)+n*(n+1)/2)==sum)
                {
                    for(int j=0;j<=n;j++)
                        list.add(startNum+j);
                    resultList.add(list);
                }
            }
            return resultList;
            
        }
    }

    题目二

    题目描述

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

    输出描述:

    对应每个测试案例,输出两个数,小的先输出。

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(array==null||array.length<2)
                return list;
                
            int minIndex =0,maxIndex=array.length-1;
            
            while(minIndex<maxIndex){
                if(array[minIndex]+array[maxIndex]==sum)
                {
                    list.clear();
                    list.add(array[minIndex]);
                    list.add(array[maxIndex]);
                    break;
                }else if(array[minIndex]+array[maxIndex]>sum){
                    maxIndex--;
                }else {
                    minIndex++;
                }
            }
            return list;
        }
    }

    题目三

    题目描述

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

    public class Solution {
        public String LeftRotateString(String str,int n) {
            if(str.length()==0)
                return str;
            StringBuffer str1  = new StringBuffer(str.substring(0,n));
            StringBuffer str2  =  new StringBuffer(str.substring(n,str.length()));
            str2.append(str1);
            return str2.toString();
        }
    }

    题目四

    题目描述

    牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

    public class Solution {
        public String ReverseSentence(String str) {
            if(str==null||str.trim().length()<=1)
                return str;
            String[] strs = str.split(" ");
            StringBuffer sb = new StringBuffer();
            for(int i=strs.length-1;i>=0;i--)
            {
                sb.append(strs[i]);
                if(i>=1)
                    sb.append(" ");
            }
               
            return sb.toString();
        }
    }

    题目五

    import java.util.Arrays;
    public class Solution {
        public boolean isContinuous(int [] numbers) {
            int length = numbers.length;
            if(length==0)
                return false;
            int zeroNum=0;
            int intervalNum=0;
            Arrays.sort(numbers);
            for(int i=0;i<length-1;i++){
                if(numbers[i]==0){
                    zeroNum++;
                    continue;
                }
                if(numbers[i]==numbers[i+1])
                    return false;
                intervalNum+=numbers[i+1]-numbers[i]-1;
            }
            if(zeroNum>=intervalNum)
                return true;
            return false;
    
        }
    }

    题目六

    题目描述

    每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)


    两种解法(本质一样!)第二种更好懂点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import java.util.*;
    public class Solution {
        public int LastRemaining_Solution(int n, int m) {
            if (m == 0 || n == 0)
                return -1;
            ArrayList<Integer> data = new ArrayList<Integer>();
            for (int i = 0; i < n; i++) {
                data.add(i);
            }
            int index = 0;
            while (data.size() > 1) {
                index = (index + m-1) % data.size();
                data.remove(index);
            }
            return data.get(0);
        }
    }

    第二种更易懂

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import java.util.*;
    public class Solution {
        public int LastRemaining_Solution(int n, int m) {
            if (m == 0 || n == 0) {
                return -1;
            }
            ArrayList<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<n;i++)
                list.add(i);
            int size = list.size();
     
            //注意一个关键点:第一次删人和后来的删人不一样!
     
            //第一次出局时(不用考虑之前少了个人)。第一次直接拿着开始下标和第几个算就行了
            int LoopStartIndex=0;
            int RemoveIndex = (LoopStartIndex+(m-1))%size;
            list.remove(RemoveIndex);
            size = list.size();
     
            //第二次及之后出局(要考虑之前少了个人了,删除下标得-1),要考虑走了人,得-1了
            while(size!=1){
                LoopStartIndex=(RemoveIndex+1)%size;
                RemoveIndex = (LoopStartIndex+(m-1)-1)%size;
                list.remove(RemoveIndex);
                size = list.size();
            }
            return list.get(0);
        }
    }

  • 相关阅读:
    反汇编测试20191325
    20191325mystat
    20191325学习笔记8
    20191325学习笔记7
    2.3.1测试 20191325
    20191214-改进ls
    团队作业4
    20191214-反汇编测试
    stat命令的实现-mysate(必做)
    图片
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380924.html
Copyright © 2020-2023  润新知