2016.8.3
import java.util.Scanner;
public class test {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int result=0;
int[] a = new int[n];
int sum =0;
for(int i= 0; i<n; i++){
a[i]= in.nextInt();
}
if(n==1)
{
result=a[0];
}
while(n>1)
{
int index=findmin(a,n);
if(index==n-1){
result+=a[index]+a[0];
a[0]=a[index]+a[0];
}
else{
result+=a[index]+a[index+1];
//数组向前删除index+1这个元素
a[index]=a[index]+a[index+1];
for(int i=index+2;i<n;i++)
{
a[i-1]=a[i];
}
}
n--;
}
System.out.print(result);
}
//坐标加后面值最小,就返回最小值
public static int findmin(int a[],int n)
{
int temp=a[n-1]+a[0],index=n-1;
for(int i=0;i<n-1;i++)
{
if((a[i]+a[i+1])<temp){
temp=a[i]+a[i+1];
index=i;}
}
if(a[n-1]+a[0]<temp)
{
temp=a[0]+a[n-1];
index=n-1;}
return index;
}
}
踩过的坑
要找队列中最大值,那么最开始的temp就要赋为一个特别大的值,如果temp=0,然后找又比这个小的,就替换,根本替换不到好吗;temp初始化时谁的值,index也要改为对应的,要不然temp不被替换,返回的应该也是对的index。
这是循环队列,因此最后一个元素要特殊处理。不同的地方有:删除时,不需要后面元素移动,直接n--就行,还有,尾部的下个元素不是i+1,而是0;其他的是一样的,别忘记了,一样要把两个元素求和赋值给前一个元素。还有很特殊的情况,如果只有1个元素的话要特殊处理。
上面的代码属于中规中矩型,也可以用动态规划这种高大上的代码,参考
其他人的代码
public class test {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int count =0;
String result="";
String []strs=strs=s.split(" ");
for(int i=0;i<strs.length;i++){
int num=Integer.valueOf(strs[i]);
strs[i]=Integer.toBinaryString(num);
if(strs[i].length()<3)
{
result=result+0+" ";
}
else if (strs[i].length()==3) {
result=result+0+" ";
}else
result=result+strs[i].subSequence(strs[i].length()-3, strs[i].length()-2)+" ";
}
System.out.printf(result.substring(0, result.length()-1));
}
}
踩的坑
● 输入一行数字,空格分开,但是没有指定数字个数
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String []strs=strs=s.split(" ");
● 字符串截取函数subsequence(字符起始位值,终止位置)不包含终止位置
● 整形数值十进制、二进制之间转换
java进制转换。java中进行二进制,八进制,十六进制,十进制间进行相互转换
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
或者利用位运算
没写
2016.8.10
package datapreprocess;
import java.util.Scanner;
public class findMoney {
/**
* @param args
*/
static int [] money=new int[7];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int a;
//java初始化一个数组
money[0]=1;
money[1]=2;
money[2]=5;
money[3]=10;
money[4]=20;
money[5]=50;
money[6]=100;
while(( a=in.nextInt())!=0)
{
for(int i=6;i>=0;i--)
{
if(money[i]<=a)
{
int result=changemoney(a,i);
System.out.println(result);
break;}//if
}//for
}//while
}
static public int changemoney(int a,int i)
{
if(i==0||a==1)
{
return 1;
}
else if(i<0||a<0){
return 0;
}
else {
return changemoney(a-money[i], i)+changemoney(a, i-1);
}
}
}
踩的坑:1.把问题想请,想就去做,递归实现时注意结束条件2.java初始化一个数组的方法,不能在声明的时候就赋值吗?
package datapreprocess;
import java.util.Scanner;
public class BigdataSum{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
//java初始化一个数组
String a=new String();
String b=new String();
a=in.nextLine();
b=in.nextLine();
int length=a.length()>b.length()?a.length():b.length();
int[] a1=new int[length+1];
int[] b1=new int[length+1];
int[] result=new int[length+1];
int[] jw=new int[100];
for(int i=a.length()-1;i>=0;i--)
{
a1[a.length()-1-i]=a.charAt(i)-48;
}
a1[a.length()]=0;
for(int i=b.length()-1;i>=0;i--)
{
b1[b.length()-1-i]=b.charAt(i)-48;;
}
b1[b.length()]=0;
jw[0]=0;
for(int i=0;i<length+1;i++)
{
int c=a1[i]+b1[i]+jw[i];
jw[i+1]=c/10;
result[i]=c%10;
}//while
int i;
if(result[length]==0)
i=length-1;
else
i=length;
for(;i>=0;i--)
{
System.out.print(result[i]);
}
}
}
踩的坑:1)初始化两个整形数组的时候,要按最长的数组长度来初始化,并且还得+1,这样,就算一长一短的话也得有的加,就算最高位进位了,也有得加。2)在输出时注意,如果最高位是0 的话,就代表没有进位,可以不用输出,2)直接把一个字符型的数赋值给整形,是把ASCII码给整形的,所以还要再减48.
还可以用java中自带的BigInteger类型
while (in.hasNext())
{
a=in.nextBigInteger();
b=in.nextBigInteger();
System.out.print(a.add(b));
}
8.16
{
public static void main(String args[]){
Scanner in = new Scanner(System.in);
String a=in.nextLine();
char[] strs=new char [a.length()];
strs=a.toCharArray();
char front=strs[0];
int count=1;
for(int i=1;i<a.length();i++)
{
if(strs[i]>='A'&&strs[i]<='Z')
{
if(front==strs[i])
count++;
else {
System.out.print(front+""+count);
front=strs[i];
count=1;
}
}
else {
continue;
}
}
System.out.print(front+""+count);
}
}
判断一个字符是字母,用a>='A'&&a<='Z';在输出的时候,一个字符加一个数字会被变成ASCII码相加。
import java.util.Scanner;
public class Test2 {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String a=new String();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{ int k=in.nextInt();
if(i>j)
a+=k;
else
a+="0";
}
}
System.out.print(a);
}
}
坑:不一定要写成要求的函数体,只要输出正确即可。千万别条件判断再输入,先输入在条件判断
几种常见的输入输出方式
- 多行输入的话,每行只有一个数字。hasnext()判断是否有下一个元素;hasNextInt()判断是否有数字。
- 多行输入,每行有一组数字。
- 大整数 BigInteger,BigDecimal。
- 输出:
System.out.printf("格式",i);格式有:"输出一个浮点数:%+9.2f(输出长度为9.带2位小数),一个整数:%d,%x(16进制),%o(8进制),一个字符串:%s"。
将字符串转换成字符数组,String st = "abcdefg";char[] ch;ch = st.toCharArray();