zoukankan      html  css  js  c++  java
  • java算法题2

    java算法题2


    1.【15分】 标题:字符逆序 | 时间限制:1秒 | 内存限制:32768K

    将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。
    输入参数:
    inputString:输入的字符串
    返回值:
    输出转换好的逆序字符串

    输入描述:
    输入一个字符串,可以有空格
    输出描述:
    输出逆序的字符串
    示例1
    输入
    I am a student
    输出
    tneduts a ma I

        /**
         * 反转字符串
         * @param str string字符串
         * @return string字符串
         */
        public String solve (String str) {
            char[] a = str.toCharArray();
            for (int i = 0, j = str.length()-1; j >= i; j--, i++ ) {
                char c = a[i];
                a[i] = a[j];
                a[j] = c;
            }
           //return ""+ new StringBuffer(str).reverse();
           return String.valueOf(a);
        }
      
        /**
         *翻转数字-321 -》  -123
         * @param x int整型
         * @return int整型
         */
        public int reverse (int x) {
            String bb = new StringBuffer(Math.abs(x)+"").reverse().toString();
            try{
                return x>0? Integer.parseInt(bb): 0-Integer.parseInt(bb);
            }catch(Exception o){
                return 0;
            }
        }
    
        public static void main(String[] args) throws IOException{
          BufferedReader b=  new BufferedReader(new InputStreamReader(System.in));
          String br =null;
          while((br = b.readLine()) != null){
              //System.out.println(new StringBuffer(br).reverse().toString()); //8ms
              char[] ss =br.toCharArray();
              StringBuffer sb= new StringBuffer();
              for(int i= ss.length-1;i>=0;i--){
                  sb.append(ss[i]);
              }
    
              System.out.println(sb.toString());//9ms
          }
        }
    

    2.【15分】 标题:字符串替换 | 时间限制:3秒 | 内存限制:32768K

    请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
    给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
    测试样例:
    "A%sC%sE",7,['B','D','F']
    返回:"ABCDEF"

        public String formatString(String A, int n, char[] arg, int m) {
            char[] s0 = A.toCharArray();
            //if( A.length()> 500 || s0.length < m+1) return ""+s0.length;
            StringBuilder sb = new StringBuilder();
            int c=0;
            for(int i=0;i<s0.length;i++){
                if((i+1)< s0.length && s0[i] == '%' && s0[i+1] == 's'){
                     sb.append(arg[c]);
                     c++;
                     ++i;
                }else sb.append(s0[i]);
               
            }
    
            for(;c<arg.length;c++){
                 sb.append(arg[c]);
            }
            return sb.toString();
        }
    

    【15分】 标题:删除公共字符 | 时间限制:1秒 | 内存限制:32768K

    输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
    输入描述:
    每个测试输入包含2个字符串
    输出描述:
    输出删除后的字符串
    示例1
    输入
    They are students. 
    aeiou
    输出
    Thy r stdnts.

          public static void main(String[] args) throws IOException{
              BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
              String s = null;
              while((s = br.readLine()) != null){
                  //char[] s0= br.readLine().toCharArray();
                  String s0= br.readLine();
                  char[] s1 =s.toCharArray();
                  //StringBuilder sb =new StringBuilder();
                  for(int i=0;i<s1.length;i++){
                      if(!s0.contains(String.valueOf(s1[i]))){
                           System.out.print(s1[i]);
                      }
                  }
                  System.out.println();
              }
          }
    

    6.【15分】 标题:字符串的旋转 | 时间限制:3秒 | 内存限制:32768K

    对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
    给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
    测试样例:
    "ABCDEFGH",8,4
    返回:"FGHABCDE"

    import java.util.*;
    public class StringRotation {
        public String rotateString(String A, int n, int p) {
            
            if(p==n-1){
                return A;
            }else{
                 return A.substring(p+1,n)+A.substring(0,p+1);
            }    
        }
    }
    

    7.【15分】 标题:字符集合 | 时间限制:1秒 | 内存限制:32768K

    输入一个字符串,求出该字符串包含的字符集合
    输入描述:
    每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
    输出描述:
    每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
    示例1
    输入
    abcqweracb
    输出
    abcqwer

        public static String singleChar(String string){
            int[] chars = new int[256];
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i < string.length(); i++){
                if (chars[string.charAt(i)] == 0){
                    stringBuffer.append(string.charAt(i));
                }
                    chars[string.charAt(i)]++;
            }
            return stringBuffer.toString();
        }
    

    【返回最长回文子串的长度】

    import java.io.*;
    
    public class Main{
        public static void main(String[] args)throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
          //  while((str = br.readLine()) != null){
                int max = 0;
                int len = str.length();
                for(int i = 0; i < len; i++){
                    int l = i - 1;
                    int r = i;
                    while(l >= 0 && r < len && str.charAt(l) == str.charAt(r)){
                       if(r - l + 1 > max){
                           max = r - l + 1;
                       }
                        l--;
                        r++;
                    }
                    l = i - 1;
                    r = i + 1;
                    while(l >= 0 && r < len && str.charAt(l) == str.charAt(r)){
                        if(r - l + 1 > max){
                            max = r - l + 1;
                        }
                        l--;
                        r++;
                    }
                }
                System.out.println(max);
           // }
        }
    }
    
    #### 【给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
    注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。】
    ```java
    import java.io.*;
    public class Main{
        public static void main(String[] args)throws Exception{
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str1 = "";
            String str2 = "";
     
            while((str1 = bf.readLine())!= null && (str2 = bf.readLine())!= null){
                int max = 0;
                char[] cha1 = str1.toCharArray();
                char[] cha2 = str2.toCharArray();
                for(int i = 0; i < str1.length(); i++){
                    for(int j = 0; j < str2.length(); j++){
                        int t1 = i;
                        int t2 = j;
                        int count = 0;
                        while(cha1[t1] == cha2[t2]){
                            t1++;
                            t2++;
                            count++;
                            max = Math.max(count,max);
                            if(t1 == cha1.length || t2 == cha2.length) break;
                        }
                    }
                }
                System.out.println(max);
            }
        }
    }
    

    8.【15分】 标题:字符串变形 | 时间限制:1秒 | 内存限制:32768K

    对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。
    输入描述:
    给定一个字符串s以及它的长度n(1≤n≤500)
    输出描述:
    请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
    示例1
    输入
    "This is a sample",16
    输出
    "SAMPLE A IS tHIS"

        public String trans(String s, int n) {
           //if(s.equals(" ")||s.isEmpty()|| s.isBlank() ) return s;
           char[] arr = s.toCharArray();
           StringBuffer sb=new StringBuffer();
           int pos=0;
           for(int i=0;i < arr.length;i++){
               char temp= arr[i];
               if(Character.isLowerCase(temp)) {
                   sb.insert(pos,Character.toUpperCase(temp));
                   pos++;
               }else if(Character.isUpperCase(temp)) {
                   sb.insert(pos,Character.toLowerCase(temp));
                   pos++;
               }else if(Character.isWhitespace(temp)){
                   pos=0;
                   sb.insert(pos,temp);
              };
           }
           return sb.toString();
        }
    

    9.【15分】 标题:寻找第K大 | 时间限制:3秒 | 内存限制:32768K

    有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
    给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
    测试样例:
    [1,3,5,2,2],5,3
    返回:2

    public class Solution {
        public int findKth(int[] a, int n, int K) {
            //....
        }
       
    }
    
    

    10.【15分】 标题:统计大写字母个数 | 时间限制:1秒 | 内存限制:32768K

    找出给定字符串中大写字符(即'A'-'Z')的个数
    接口说明
    原型:int CalcCapital(String str);
    返回值:int

    注意:测试数据需要考虑循环输入
    输入描述:
    输入一个String数据
    输出描述:
    输出string中大写字母的个数
    示例1
    输入
    add123#$%#%#O
    输出
    1

        public static void main(String[] args) throws IOException {
           BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
           String br=null;
           while((br=b.readLine()) != null){
               //System.out.println(br.replaceAll("[^A-Z]+","").length()); 13ms
              char[] ss=br.toCharArray();
              int count=0;
              for(int i=0;i<ss.length;i++){
                  //if(ss[i]>= 'A' && ss[i]<= 'Z') count++; //13ms
                  if(Character.isUpperCase(ss[i])) count++; //9ms
              }
              System.out.println(count);
           }
        }
    
    //一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。【字符统计】
        public static void main(String[] args) throws IOException{
           BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
           String ss=null;
           while((ss=b.readLine()) !=null){
               char[] s= ss.toCharArray();
               int[] asc= new int[123];
    
               for(int i=0;i<s.length;i++){
                   asc[s[i]]++;
               }
    
               int max =0;
               for(int j=0;j<asc.length;j++){
                  if(max < asc[j]) max = asc[j];
               }
    
               StringBuffer sb = new StringBuffer();
               while(max != 0){
                  for(int k=0;k<asc.length;k++){
                    if(max == asc[k]) sb.append((char)k);
                  }
                  max--;
               }
    
               System.out.println(sb.toString());
           }
        }
    

    【字符分割 [123456789 -> 12345678,900000000]】

        public static void main(String[] args)throws IOException{
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           String s = null;
           while((s= br.readLine()) != null){
               int count = s.length();
               StringBuilder sb=new StringBuilder();
               int pos=0;
               while(count >= 8){
                  //sb.append(s.substring(pos,pos+8)+"
    ");
                  System.out.println(s.substring(pos,pos+8));
                  count -= 8;
                  pos += 8;
               }
    
               if(count >0 ) {
                  //sb.append(s.substring(pos));
                  //sb.append((Math.round(Math.pow(10,8-count))+"").substring(1));
                  System.out.print(s.substring(pos));
                  System.out.println((Math.round(Math.pow(10,8-count))+"").substring(1));
               }
    
           }
        }
    

    11.【15分】 标题:查找输入整数二进制中1的个数 | 时间限制:1秒 | 内存限制:32768K

    请实现如下接口
         public   static   int  findNumberOf1( int num)
        {
             /*  请实现  */
             return  0;
        } 譬如:输入5 ,5的二进制为101,输出2
     
    涉及知识点:
    输入描述:
    输入一个整数
    输出描述:
    计算整数二进制中1的个数
    示例1
    输入
    5
    输出
    2

    
    public class Solution {
        public int NumberOf1(int n) {
             int res = 0;
             while(n!=0){
                 res += n&1;
                 n >>>= 1;
             }
             return res;
        }
    
      public static void main(String[] args) throws IOException{
          BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
          String b = null;
          while((b=br.readLine()) != null){
              int count=0,max=0;
              int n=Integer.parseInt(b);
              while(n != 0){
                if((n&1)> 0){ 
                    count++;
                }else {
                    max = max < count ?count : max;
                    count=0;
                }
                n >>>=1;
              }
    
              //count=Integer.toBinaryString(Integer.parseInt(b)).replaceAll("0","").length();
              System.out.println(max < count ?count : max);
          }
      }
    }
    

    12.【15分】 标题:字符串中找出连续最长的数字串 | 时间限制:1秒 | 内存限制:32768K

    读入一个字符串str,输出字符串str中的连续最长的数字串
    输入描述:
    个测试输入包含1个测试用例,一个字符串str,长度不超过255。
    输出描述:
    在一行内输出str中里连续最长的数字串。
    示例1
    输入
    abcd12345ed125ss123456789
    输出
    123456789

        public static void main(String[] args) throws IOException{
           BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
           String ss=null;
           while((ss=b.readLine()) !=null){
               String[] s = ss.split("[^0-9]+");
               int max = 0;
               for(int i=0;i<s.length;i++){
                  if(s[i].length() ==0 ) continue;
                  if(max < s[i].length()) max = s[i].length();
               }
               StringBuilder sb=new StringBuilder();
               for(int i=0;i<s.length;i++){
                  if(max == s[i].length()) sb.append(s[i]);
               }
               System.out.println(sb +","+ max);
           }
        }
    

    13.【15分】 标题:找出字符串中第一个只出现一次的字符(题面已经更新) | 时间限制:1秒 | 内存限制:32768K

    找出字符串中第一个只出现一次的字符
    输入描述:
    输入几个非空字符串
    输出描述:
    输出第一个只出现一次的字符,如果不存在输出-1
    示例1
    输入
    asdfasdfo
    aabb
    输出
    o
    -1

        public int FirstNotRepeatingChar(String str) {
            if(str.length()==1){
                return 0;
            }
     
            for(int i=0;i<str.length();i++){
                if(str.indexOf(str.charAt(i))== str.lastIndexOf(str.charAt(i))){
                    return i;
                }
            }
     
            return -1;
        }
    #### 【找出字符串中第一个只出现一次的字符】
        public static void main(String[] args)throws IOException{
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           String str = null;
           while ((str = br.readLine()) != null) {
               char[] s0 =str.toCharArray();
               for(int i=0;i<s0.length;i++){
                   char c= s0[i];
                   if(str.indexOf(c)==str.lastIndexOf(c)){
                       System.out.println(c);
                       break;
                   }
                   if(i == (s0.length-1)) System.out.println(-1);
                   
               }
              
           }
        }
    

    【数组中只出现一次的数(其它数出现k次)】

    public class Solution {
        /**排序
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         * @param arr int一维数组 
         * @param k int 
         * @return int
         */
    public int foundOnceNumber (int[] arr, int k) {
            // 每个二进制位求和,如果某个二进制位不能被k整除,那么只出现一次的那个数字在这个二进制位上为1。
            int[] binarySum = new int[32];
            for(int i = 0; i< 32; i++){//求每个二进制位的和
                int sum = 0;
                for(int num : arr){
                    sum += (num >>i & 1);//依次右移num,同1相与,计算每一位上1的个数
                }
                binarySum[i] = sum;
            }
            int res = 0;
            for (int i = 0; i< 32; i++){
                if(binarySum[i]%k!=0){
                    res += 1<<i;//左移恢复
                }
            }
            return res;
        }
    }
    
    //位运算
    public int foundOnceNumber (int[] arr, int k) {
            // 每个二进制位求和,如果某个二进制位不能被k整除,那么只出现一次的那个数字在这个二进制位上为1。
            int[] binarySum = new int[32];
            for(int i = 0; i< 32; i++){//求每个二进制位的和
                int sum = 0;
                for(int num : arr){
                    sum += (num >>i & 1);//依次右移num,同1相与,计算每一位上1的个数
                }
                binarySum[i] = sum;
            }
            int res = 0;
            for (int i = 0; i< 32; i++){
                if(binarySum[i]%k!=0){
                    res += 1<<i;//左移恢复
                }
            }
            return res;
        }
    
    //hashmap
    public int foundOnceNumber (int[] arr, int k) {
            // write code here
            HashMap<Integer, Boolean> map = new HashMap<>();//key存数字,value表示是否出现过
            for(int num: arr){
                if(map.containsKey(num)){
                    map.put(num, true);
                }else{
                    map.put(num, false);
                }
            }
            Set<Integer> set = map.keySet();
            for(int num : set){
                if(map.get(num) == false){
                    return num;
                }
            }
            return 0;
        }
    
    public int foundOnceNumber (int[] arr, int k) {
            // write code here
            HashMap<Integer, Integer> map = new HashMap<>();//key存数字,value表示是否出现过
            for(int num: arr){
                if(map.containsKey(num)){
                    map.put(num, map.get(num)+1);
                }else{
                    map.put(num, 1);
                }
            }
            Set<Integer> set = map.keySet();
            for(int num : set){
                if(map.get(num) == 1){
                    return num;
                }
            }
            return 0;
        }
    

    14.对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

    给定字符串A以及它的长度n,请返回最长回文子串的长度。
    输入
    "abc1234321ab",12
    返回值
    7

        public int getLongestPalindrome(String A, int n) {
            char[] ch = A.toCharArray();
            int res = 0;
            for(int i = 0; i < n; i++){
                int l = i, r = i, sameR = i;
                //定位左右两边,避免abba和aba
                while(l - 1 >= 0 && ch[l - 1] == ch[i]) l--;
                while(r + 1 < n && ch[r + 1] == ch[i]) r++;
                sameR = r;
                 
                while(l - 1 >= 0 && r + 1 < n && ch[l - 1] == ch[r + 1]){
                    l--;
                    r++;
                }
                 
                res = Math.max(res, r - l + 1);
                 
                //优化
                i = sameR;
            }
            return res;
        }
    

    15.给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。

    示例1
    输入
    [2,3,4,5]
    返回值
    4

        /**
         * @param arr int整型一维数组 the array
         * @return int整型
         */
        public int maxLength (int[] arr) {
            // write code here
            //int[] lastPos = new int[100000];
            int len = arr.length;
            int[] lastPos = new int[len];
            int start = 0;
            int res = 0;
            for(int i =0;i<len;i++){
                int now = arr[i];
                start = Math.max(start,lastPos[now]);
                res = Math.max(res,i-start+1);
                lastPos[now] = i+1;
            }
             
            return res;
        }
    

    16.大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

    public int Fibonacci(int n) {
        if(n==0){
            return 0;
        }else if(n==1 || n==2){
            return 1;
        }else if(n==3){
            return 2;
        }
        int f2 =1,sum=2;
        while(n>3){
            int temp=sum;
            sum =f2 + sum;
            f2=temp;
            n--;
        }
        return sum;
    }
    

    17.请实现有重复数字的升序数组的二分查找

    给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,
    写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
    [1,2,4,4,5],4
    返回值
    2

        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 如果目标值存在返回下标,否则返回 -1
         * @param nums int整型一维数组 
         * @param target int整型 
         * @return int整型
         */
        public int search (int[] nums, int target) {
            if(nums==null||nums.length==0) return -1;
            int first = 0;
            int last = nums.length-1;
            while(first<last){
                int middle = (first +last)/2;
                if(nums[middle]>target){
                    last = middle-1;
                }else if(nums[middle]<target){
                    first=middle+1;
                }else{
                    last=middle;
                }
            }
            if(nums[first]==target) return first;
            return -1;
        }
    

    18.数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。

    由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
    示例1
    输入
    [1,2,3,2,2,2,5,4,2]
    返回值
    2

        public int MoreThanHalfNum_Solution(int [] array) {
            int len=array.length;
            if(len==0) return 0;
            int ret=0,res=array[0],count=1;
            for(int i=1;i<len;i++){
                if(count==0){
                    res=array[i];
                    count++;
                    continue;
                }
                if(array[i]!=res){
                    count--;
                }else count++;
            }
            for(int num:array){
                if(num==res) ret++;
            }
            return ret>(len>>1)?res:0;
        }
    

    19.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    public class Solution {
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();
        
        public void push(int node) {
            stack1.push(node);
        }
        
        public int pop(){
          if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
            return stack2.pop();
          }else{
              return stack2.pop();
          }
          
        }
    }
    

    20.【ACM编程题】标题:组队竞赛|时间限制:1秒|内存限制:32768K

    示例1:
    输入
    2
    5 2 8 5 1 5

    输入的第一行为一个正整数n(1≤n≤10^5)
    第二行包括3*n个整数a_i(1≤a_i≤10^9),表示每个参赛选手的水平值.
    输入描述:
    输出一个整数表示所有队伍的水平值总和最大值.
    null
    输出描述:
    10

        public static void main(String[] args){
            Scanner scanner =new Scanner(System.in);
            int n = scanner.nextInt();
            int len = 3 * n;
            int[] as= new int[len];
    
            for(int j=0;j<len;j++){
                as[j] = scanner.nextInt();
            }
            Arrays.sort(as);// 1 2 5 5 5 8
            long sum=0;
            //1:从数组递减的形式递减统计
            for(int j = len - 2;j >= n;j -= 2){
                sum += as[j];
            }
            //2:从队列数递增的形式统计
            for(int j=0;j < n;j ++){
                sum += as[len - 2*(j+1)];
            }
            System.out.println(sum);
       }
    
  • 相关阅读:
    Docker常用命令
    Spark资源管理
    在Centos 7上安装Docker
    Docker网络管理
    Tensorflow 入门
    Spark远程调试函数
    Spark核心组件
    Spark job执行流程消息图
    数据库优化实践【性能检测工具篇】
    软件工程之系统建模篇【设计数据模型】
  • 原文地址:https://www.cnblogs.com/yiyangyu/p/suanfa002.html
Copyright © 2011-2022 走看看