#Java算法
1、盒子中有n个小球每次取一个或者两个有多少种取法
代码如下(示例):
//反向思路,假如有5个球每次取一个或者两个,相加直到递归最终取完。
public static void main(String[] args) {
System.out.println(StepWay(5));
}
public static int StepWay(int n){
if(n<1){
//判断输入是否错误
return 0;
}else if(n==1){
//1个球只有一种取法
return 1;
}else if(n==2){
//2个球2种取法
return 2;
}else{
return StepWay(n-1)+StepWay(n-2);
}
}
2.三位水仙花数的各个数值的里放相加等于本身如153=1x1x1+5x5x5+3x3x3
代码如下(示例):
public static void main(String[] args) {
outNumber() ;
}
public static void outNumber(){
int a=0;
int b=0;
int c=0;
for(int i=100;i<1000;i++){
a=i/100;
b=i/10%10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i){
System.out.print(i+" ");
}
}
}
3.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
public static void main(String[] args) {
rabit() ;
}
public static void rabit(){
int f1=1;
int f2=2;
int f=0;
int m=30;
for(int i=3;i<m;i++){
f=f2;
f2=f1+f2;
f1=f;
System.out.println(f2);
}
}
4、101-200之间有多少个素数
public static void main(String[] args) {
judgeCnt() ;
}
public static void judgeCnt(){
int cnt=0;
for(int i=101;i<=200;i++){
int n=2;
Boolean flag=true;
while(n*n<i){
if(i%n == 0){
flag=false;
}
n+=1;
}
if(flag==true){
cnt+=1;
}
}
System.out.println(cnt);
}
5、解质因素90=2x3x3x5
public static void main(String[] args) {
FenJie() ;
}
public static void FenJie(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数");
int ip=sc.nextInt();
int k=2;
while(ip>=k){
if(ip==k){
System.out.println(ip);
break;
}else if(ip%k==0){
System.out.print(k+"*");
ip=ip/k;
}else{
k++;
}
}
}
6、冒泡排序
public static void main(String[] args) {
Maopao() ;
}
public static void Maopao(){
int [] arr1={2,3,1,7,8,9};
int temp=0;
for(int i=0;i<arr1.length-1;i++){
for(int j=0;j<arr1.length-1-i;j++){
if(arr1[j]>arr1[j+1]){
temp=arr1[j+1];
arr1[j+1]=arr1[j];
arr1[j]=temp;
}
}
}
System.out.println(Arrays.toString(arr1));
}
7、快速排序
public static void main(String[] args) {
quickSort() ;
}
public static void quickSort(){
int [] arr1={2,3,6,9,4};
int left=0;
int right=arr1.length-1;
SortArr(arr1,left,right);
System.out.println(Arrays.toString(arr1));
}
public static int [] SortArr(int [] arr1,int left,int right){
if(arr1.length==0||left>right){
return arr1;
}
//设为基准数
int base=arr1[left];
int temp=0;
int i=left;
int j=right;
while(i!=j){
while(i<j&&arr1[j]>base){
j--;
}
while(i<j&& arr1[i]<=base){
i++;
}
if(arr1[i]>arr1[j]) {
temp = arr1[j];
arr1[j] = arr1[i];
arr1[i] = temp;
}
}
//交换中间数
arr1[left]=arr1[i];
arr1[i]=base;
SortArr(arr1,left,i-1);
SortArr(arr1,i+1,right);
return arr1;
}
8、两个有序数组合并成一个有序数组
public static void main(String[] args) {
CombieArr() ;
}
public static void CombieArr(){
int []arr1={2,4,6,8};
int [] arr2={1,3,5,7,9};
int i=0;
int j=0;
int k=0;
int [] arr3=new int [arr1.length+arr2.length];
while (i<arr1.length&&j<arr2.length){
if(arr1[i]<arr2[j]){
arr3[k++]=arr1[i++];
}else{
arr3[k++]=arr2[j++];
}
}
while (i<arr1.length){
arr3[k++]=arr1[i++];
}
while(j<arr2.length){
arr3[k++]=arr2[j++];
}
System.out.println(Arrays.toString(arr3));
}
9、折半二分查找
public static void main(String[] args) {
find2() ;
}
public static void find2(){
int mid=0;
int cnt=1;
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数:");
int num=sc.nextInt();
int [] arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int left=0;
int right=arr.length-1;
while(left<=right){
mid=(left+right)/2;
if(num==arr[mid]){
System.out.println("第"+cnt+"次找到"+num+",在"+mid+"处找到");
break;
}else if(num<arr[mid]){
right=mid-1;
}else if(num>arr[mid]){
left=mid+1;
}
cnt+=1;
}
}
10、字符串种只出现一次的字符
public static void main(String[] args) {
Once() ;
}
public static void Once(){
String str="abcabcacbefefadeh";
LinkedHashMap<Character,Integer> map=new LinkedHashMap<Character,Integer>();
for(int i=0;i<str.length();i++){
if(!map.containsKey(str.charAt(i))){
map.put(str.charAt(i),1);
}else{
map.put(str.charAt(i),map.get(str.charAt(i))+1);
}
}
for(int i=0;i<str.length();i++){
if(map.get(str.charAt(i))==1){
System.out.println(str.charAt(i)+"第"+i+"个");
}
}
}
总结
提示:字符串转换为数字这样的"-13542"->-13542只要用好 number=number10+arr[i]-'0’基本没什么难度;判断数组丢失的值这种基本上明白
int x=n(n+1)/2 -sum;
System.out.println(x)也就很容易理解了: