200题计划(3)

 最近状态不好,

今天就好好休息啦,

明天不要懒哦~

目录

1.字符串中找出最长的字符串

2.数组中出现次数超过一半的数字

3.计算糖果

4.进制转换


1.字符串中找出最长的字符串

字符串中找出连续最长的数字串_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/bd891093881d4ddf9e56e7cc8416562d?tpId=85&&tqId=29864&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

①题目示例:

②方法解析:

该题就是找出连续最长的字符串,但是我们很容易看到,字符串里面既有数字字符也有字母字符,而这种间断的分布,就使得每个字符串的长度可能不同,因为我们要找的是最长的,所以我们设置两个String来用,一个用于cur暂时存储,另一个ret用于最终结果。每当我们遇到数字时放入cur中,当又遇到非数字时,我们就比较cur和ret的大小,因为ret是存放最终结果的,所以要存放较大的。

代码:

import java.util.*;
class Main1 {
     public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
//设置两个空字符串为后续做准备
String cur="";
String ret="";
//因为在循环结束后仍然需要用到i,所以把i定义在循环外
int i=0;
for(;i<str.length();i++){
    char ch=str.charAt(i);
    if(ch>='0'&&ch<='9'){
        //就将数字放于cur中进行拼接,需要注意的是,放入的是数,要想变成字符串,最简单的方式是拼接一个“”
        cur=cur+ch+"";
    }//当字符该为非数字时勿忘比较ret和cur的大小
    else{
        if(ret.length()<cur.length()){
            ret=cur;
        }//要是为非数字,且ret的值更大,那么就把cur所在的字符串置为“”
        else{
            cur="";
        }
    }
}//当末尾的数为数字时,需要进行判断,因为最后i已经进不去循环了
         if(i==str.length()&&ret.length()<cur.length()){
             ret=cur;
         }
         System.out.println(ret);
     }
    }

2.数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

①题目示例:

②方法解析一:

主要是采用,抵消的方法,我们可以知道,当一个数出现比一般都多,且是出现最多的数的时候,它必然是众数。而采用当前后不一致就抵消的方式,最后若剩下一个数,则极可能是众数,为什么要说极可能,因为我们还要再一次判断它出现的次数与1/2len的关系,若是>1/2len,那么很显然,它是,否则不存在此数,返回0

 class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        //先对特殊情况进行基本的判定
        if(array==null||array.length==0){
            return 0;
        }
        //用result记录当前数据,用times记录出现的次数,因为此时已经记录了一个,所以times置为1
        int result=array[0];
        int times=1;
        for(int i=0;i<array.length;i++) {
            //第一步当times!=0时的情况
            if (times != 0) {
                //如果现在的值和此前所记录的值一样,则times++;
                if (array[i] == result) {
                    times++;
                } else {
                    times--;
                }
            } else {//此处是指times=0时
                // 更新result的值为当前元素,并置次数为1 
                result = array[i];
                times = 1;
            }
        }
            // 判断result是否符合条件,即出现次数大于数组长度的一半 
            times = 0;
            for(int i=0;i<array.length;++i){
                if(array[i] == result) ++times;
            }
            return  (times > array.length/2) ? result : 0;
        }
    }

 ③方法解析二:

本题的意思在于找到出现次数超过数组长度一半的值,所以我们可以利用Map<key,value>属性来进行记录,最后遍布map来找是否存在某值>1/2它的长度

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int len = array.length;
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < len; i++)
        {
            if(map.containsKey(array[i]))
            {
                map.put(array[i], map.get(array[i]) + 1);
            }
            else
            {
                map.put(array[i], 1);
            }
        }//keySet()返回此映射中包含的键的Set视图
         //将map中所有的键存入到Set集合,因为set具备迭代器,所有迭代方式取出所有的键
          //再根据get()方法,获取每一个键对应的值
        for(Integer key : map.keySet())
        {
            if(map.get(key) > len / 2)
            {
                return key;
            }
        }
        return 0;
    }
}

④方法解析三:

若出现次数超过数组一半,那么当数组进行排序后,中位数的位置必然是那个数字,若中位数上的数字在整个数组中出现的次数大于了数组的1/2长度,那么该数即为我们所求数

代码:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

 class Main1 {
    public int MoreThanHalfNum_Solution(int [] array) {
        //考虑数组是否为空的情况
        if(array == null || array.length == 0) { return 0; }
        //对数组进行排列
        Arrays.sort(array);
        int len= array.length;;
        int mid=array[(array.length-1)/2];
        int count=0;
        for(int i=0;i< array.length;i++){
            if(array[i]==mid){
                count++;
            }
        }if(count>len/2){
            return mid;
        }
        return 0;
    }
    }

 3.计算糖果

计算糖果_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/02d8d42b197646a5bbd0a98785bb3a34?tpId=85&&tqId=29857&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

①题目示例:

 ②方法解析:

根据题意,本题可以看做是一个找规律的数学题,利用相应的等式,来进一步判断是否真的相等,相等即输出,否则为no

代码:(前面为优化代码)

import java.util.*; 
public class Main {
 public static void main(String[] args) { 
Scanner in = new Scanner(System.in);
 int a = in.nextInt(); 
int b = in.nextInt(); 
int c = in.nextInt();
int d = in.nextInt();
 int A = (a+c)/2; 
int C = (d-b)/2; 
int B1 = (b+d)/2; 
int B2 = (c-a)/2; 
if(B1 != B2) { 
System.out.print("No"); 
}else{
System.out.print(A+" "+B2+" "+C);
 }
 }
}
import java.util.Scanner;
class Main1 {
     public static void main(String[] args) {
         Scanner sc=new Scanner(System.in);
         int a=sc.nextInt();
         int b=sc.nextInt();
         int c=sc.nextInt();
         int d=sc.nextInt();
        int A = (a+c)/2;
        int B = (c-a)/2;
        int C = (d-b)/2;
         if( (A-B==a)  && (B-C==b) && (A+B ==c) && (B+C==d))
             System.out.println(A+" "+B+" "+C);
         else
             System.out.println("No");
     }
    }

4.进制转换

进制转换_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/ac61207721a34b74b06597fe6eb67c52?tpId=85&&tqId=29862&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

①题目示例:

②方法解析一:

利用除以一个数的余数为它的拼接对象,最后再进行一个逆置

代码:

import java.util.*;
 public class Main { 
public static void main(String[] args) {
 Scanner in = new Scanner(System.in); 
int m = in.nextInt(); 
int n = in.nextInt(); 
boolean flg = false;//代表为正数,这里的ABCDEF是表示10之后的数进行拼接,因为一共有16进制
 String table = "0123456789ABCDEF";
 StringBuilder ret = new StringBuilder(); 
if(m < 0) {//如果是负数的话,那么在后面取-,最后再逆置
 m = -m; 
flg = true; 
}while(m != 0) { 
ret.append(table.charAt(m%n)); m = m/n; 
}
if(flg) { 
ret.append("-"); 
}ret.reverse(); 
System.out.println(ret);}
}

③方法解析二:

首先我们很容易知道,要想让十进制数转化为N进制数的办法就是利用短除法来进行处理,左边为除数,右边为余数,下面为商,当商为0时,它的余数从下往上进行数,就为转化后的进制数。举个例子,7  2

a.用栈后进先出的特点,刚好可以将余数位完美贴合:

代码:

import java.util.*;
class Main1 {
    public static void main(String[] args) {
        Stack<Character>stack=new Stack<>();
        Scanner sc=new Scanner(System.in);
        StringBuilder sb=new StringBuilder();
        int m=sc.nextInt();
        int n= sc.nextInt();
        String ret="0123456789ABCDEF";
        while(m!=0)
        {
            stack.push(ret.charAt(m%n));
            m /= n;
        }
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }
        System.out.println(sb);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_58850105/article/details/123846298