1. 质数因子分解
n从2开始 判断,如果n %2==0,则把2添加进结果集中。
而且再次 判断n %2是否==0,如果这次不满足了,就让 n%3,等等。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
StringBuilder result = new StringBuilder();
String s= in.nextLine();
int n=Integer.parseInt(s);
int i=2;
while(n>1)
{
//最后一个也会添加进去,因为 最后质数 5%5=0
if(n%i==0)
{
result.append(i+" ");
n=n/i;
}else{
i++;
}
}
System.out.println(result.toString());
}
}
2.进制转换(这题其实做出来了,利用Math.pow做,很快
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String sh= in.nextLine();
String r1=sh.substring(2);
int sum=0;
int len=r1.length()-1;
for(int i=len;i>=0;i--)
{
char ch=r1.charAt(i);
if(ch>='A' )
{
int temp=ch-'A'+10;
sum+=temp*Math.pow(16,len-i);
}else if(ch>='0'&& ch<='9'){
int temp=ch-'0';
sum+=temp*Math.pow(16,len-i);
}
}
System.out.println(sum);
}
}
3.按照字典给每个单词排序
这题真的 得用API。
Arrays.sort(数组,比较器),里面放比较器,重写compareTo 方法。String的compareTo已经按照字典比较了。
o1.compareTo(o2),是升序比较。
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int a=in.nextInt();
in.nextLine();
String [] ss =new String[a];
int index=0;
while(in.hasNext())
{
String temp =in.nextLine();
ss[index++]=temp;
}
Arrays.sort(ss,new Comparator<String>(){
//这个compare方法没有提示,必须得自己重写
public int compare(String o1,String o2)
{
return o1.compareTo(o2);
}
});
for(String s:ss)
{
System.out.println(s);
}
}
}
也可以直接用sort对 String数组排序
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int a=in.nextInt();
in.nextLine();
String [] ss =new String[a];
int index=0;
while(in.hasNext())
{
String temp =in.nextLine();
ss[index++]=temp;
}
Arrays.sort(ss);
for(String s:ss)
{
System.out.println(s);
}
}
}
4.字符串排序
这题很精妙,看代码感受思路。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String str= in.nextLine();
List<Character> list =new ArrayList<>();
for(Character ch :str.toCharArray())
{
//先把所有英文字母加list集合
if(Character.isLetter(ch))
{
list.add(ch);
}
}
//然后对list集合里得元素排序。重写一个比较器
list.sort(new Comparator<Character>(){
public int compare(Character o1,Character o2)
{
//这里的比较规则是,比较它俩的小写状态
return Character.toLowerCase(o1)-Character.toLowerCase(o2);
}
});
//然后重新填写一个字符串。碰到英文的,用list里的,碰到其他符号照抄。
StringBuilder sb= new StringBuilder();
int index=0;
for(int i=0;i<str.length();i++)
{
if(Character.isLetter(str.charAt(i)))
{
sb.append(list.get(index));
index++;
}else{
sb.append(str.charAt(i));
}
}
System.out.println(sb.toString());
}
}
5.求最长对称子串的长度
暴力破解方法
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
//求最长对称子串,双指针其实可以做
String s= in.nextLine();
char [] ch =s.toCharArray();
int maxLen=0;
//直接学冒泡排序那样 穷举出能构成的所有字符串
for(int i=0;i<ch.length-1;i++)
{
for(int j=i+1;j<ch.length;j++)
{
String temp =s.substring(i,j+1);
if(isDuicheng(temp))
{
maxLen=Math.max(temp.length(),maxLen);
}
}
}
System.out.println(maxLen);
}
//写一个判断是否对称的函数
public static boolean isDuicheng(String s)
{
if(s.length()==1) return true;
char [] ch = s.toCharArray();
int i=0;
int j=ch.length-1;
while(j>=i)
{
if(ch[i]!=ch[j])
{
return false;
}
i++;
j--;
}
return true;
}
}
对成轴做法,比较省时间。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
//求最长对称子串,双指针其实可以做
String s= in.nextLine();
char [] ch =s.toCharArray();
int maxLen=1;
//单对称
for(int i=1;i<ch.length-1;i++)
{
maxLen=Math.max(maxLen,isDuicheng1(s,i));
}
//双对称
for(int i=1;i<ch.length;i++)
{
if(ch[i]==ch[i-1])
{
maxLen=Math.max(maxLen,isDuicheng2(s,i-1,i));
}
}
System.out.println(maxLen);
}
//对称轴为一个时
public static int isDuicheng1(String s ,int mid)
{
int i=mid-1;
int j=mid+1;
int len=1;
while(i>=0 && j<=s.length()-1)
{
if(s.charAt(i)==s.charAt(j))
{
i--;
j++;
len+=2;
}else{
return len;
}
}
return len;
}
//轴为两个时。
public static int isDuicheng2(String s ,int i,int j)
{
int len=0;
while(i>=0 && j<=s.length()-1)
{
if(s.charAt(i)==s.charAt(j))
{
i--;
j++;
len+=2;
}else{
return len;
}
}
return len;
}
}
6.整数和ip地址的转换
学到了,
1. Integer.parseint(字符串,2) 可以把字符串里的内容,从2进制的形式转换到10进制。
2.这种32位二进制转成整数,必须得用long 类型来接受。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String s1=in.nextLine();
String s2=in.nextLine();
String result2=change2(s2);
System.out.println(change1(s1));
System.out.println(result2);
}
//第一种转换
public static long change1(String s)
{
String [] ss= s.split("\\.",4);
//补全
String result="";
for(String temp:ss)
{
Integer a=Integer.valueOf(temp);
String Bs =Integer.toBinaryString(a);
if(Bs.length()<8)
{
Bs=buquan(Bs,8);
}
result+=Bs;
}
//最终转换的整数必须得是long,因为这个数字超过int的最大值。
long a=Long.parseLong(result,2);
return a;
}
//第二种转换
public static String change2(String s)
{
long a=Long.parseLong(s);
String result="";
StringBuilder sb= new StringBuilder();
String temp=Long.toBinaryString(a);
//这里需要补全 32位,然后再按每8位来分割
String Bs=buquan(temp,32);
for(int i=0;i<32;i++)
{
sb.append(Bs.charAt(i));
if((i+1)%8==0 && i!=31)
{
int num1=Integer.parseInt(sb.toString(),2);
result+=num1+".";
sb=new StringBuilder();
}else if(i==31)
{
int num1=Integer.parseInt(sb.toString(),2);
result+=num1;
}
}
return result;
}
public static String buquan(String s,int num)
{
int len=s.length();
String result="";
if(len<num)
{
int left=num-len;
while(left>0)
{
result+="0";
left--;
}
result+=s;
}else{
return s;
}
return result;
}
}
7.打印蛇形矩阵
这样斜着打印。
生成数组的代码过程为:
for(int k=0;k<n;k++)
{
int i=0;
int j=k;
while(i<n &&j>=0)
{
a[i][j]=sum;
sum++;
i++;
j--;
}
}
打印数组的过程为:
注意每行的最后一个的情况,它打印完了还得换行。
for(int j=0;j<n;j++)
{
for(int i=0;i<n;i++)
{
if(a[i][j]!=0 && i!=n-1)
{
System.out.print(a[i][j]);
System.out.print(" ");
}else if(a[i][j]!=0 && i==n-1)
{
System.out.print(a[i][j]);
System.out.println();
break;
}
else {
System.out.println();
break;
}
}
}
8.统计每个月兔子的个数(斐波那契数列)
兔子过两个月就可以生出新兔子。
那为什么新增是两个月前兔子的总量呢?
因为:过了两个月了,两个月前的兔子已经都能成熟到每个月都能生产。
可以推导出当前月份兔子的个数f(n)为:上个月兔子的个数+两个月前兔子的个数
即 f(n)=f(n-1) +f(n-2)。
9.称砝码
给 n个砝码, 和他们的重量,还有他们的个数。
求 这些砝码能组成多少个重量数?
10. 有n个数组(没有重复元素),每个数组拿一个元素出来,最终凑成长度为n的字符串,求能凑成多少个字符串。
学会一种新的穷举方法(回溯)
void travel(int k,String s,String [] ss,int starIndex)
{
if(sb.length()==k)
{
result.add(sb.toString());
return ;
}
//startIndex表示 我们要 操作下标为startIndex的数组。
int a= s.charAt(starIndex)-'0';
String temp =ss[a];//temp是我们拿到的这个字符数组。
//然后我们如此回溯,在for里完成temp数组的 元素添加,删除。
for(int i=0;i<temp.length();i++)
{
sb.append(temp.charAt(i));
//travel到下一个数组
travel(k,s,ss,starIndex+1);
sb.deleteCharAt(sb.length()-1);
}
}
11.最大子数组和
用sum来记录。
如果 发现前面的和为0了,那就把sum变成0,重新从这一位加。
class Solution {
public int maxSubArray(int[] nums) {
//sum和max都赋予初始值
int sum=nums[0];
//sum用来记录子数组的连续和,如果sum<0了,那就舍之前所有的元素,重新开始添加。
int max=nums[0];
for(int i=1;i< nums.length;i++)
{
if(sum<0)
{
sum=0;
}
sum+=nums[i];
max=Math.max(sum,max);
}
return max;
}
}
12.四则运算
是用栈实现的,但具体怎么实现的我还真不知道。
这是中缀表达式,计算比较麻烦,建议转成后缀表达式。