最近状态不好,
今天就好好休息啦,
明天不要懒哦~
目录
1.字符串中找出最长的字符串
①题目示例:
②方法解析:
该题就是找出连续最长的字符串,但是我们很容易看到,字符串里面既有数字字符也有字母字符,而这种间断的分布,就使得每个字符串的长度可能不同,因为我们要找的是最长的,所以我们设置两个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.数组中出现次数超过一半的数字
①题目示例:
②方法解析一:
主要是采用,抵消的方法,我们可以知道,当一个数出现比一般都多,且是出现最多的数的时候,它必然是众数。而采用当前后不一致就抵消的方式,最后若剩下一个数,则极可能是众数,为什么要说极可能,因为我们还要再一次判断它出现的次数与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.计算糖果
①题目示例:
②方法解析:
根据题意,本题可以看做是一个找规律的数学题,利用相应的等式,来进一步判断是否真的相等,相等即输出,否则为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.进制转换
①题目示例:
②方法解析一:
利用除以一个数的余数为它的拼接对象,最后再进行一个逆置
代码:
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); } }