颠倒的价牌
颠倒的价牌
题干:
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 68 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
代码:
package aJAVA13;
import java.util.ArrayList;
/*
* 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见p1.jpg)。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,
比如:1958 倒着挂就是:8561,差了几千元啊!!
当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
答案是一个4位的整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
* */
public class _04颠倒的价牌 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 正确的价格=>面向对象的设计
ArrayList<Price> a1 = new ArrayList<Price>();//价牌赔了2百多
ArrayList<Price> a2 = new ArrayList<Price>();//另一个价牌却赚了8百多
// 枚举四位数,简单筛选
for (int i = 1000; i < 10000; i++) {
String s = "" + i;
//是合理的数字。如:1 2 5 6 8 9 0 都可以。
if(s.contains("3")||s.contains("4")||s.contains("7")) {
continue;
}
String re_s = reverse(s);
int i1 = Integer.parseInt(re_s);
int plus = i1 - i;
// 将其颠倒和原价做差,将赔二百多的放入一个集合,
// 将赚八百多的放入一个集合
if (plus < -200 && plus > -300) {
a1.add(new Price(i, plus));
}
if (plus < 900 && plus > 800) {
a2.add(new Price(i, plus));
}
}
// 遍历两个集合两两组合,检查,是否相加为558
for (Price p1 : a1) {
for (Price p2 : a2) {
if(p1.plus + p2.plus == 558) {
System.out.println(p1.p+" " +p1.plus);
System.out.println(p2.p+" " +p2.plus);
// 输出结果
}
}
}
}
private static String reverse(String s) {
char [] ans = new char[s.length()];
int j;
int i;
for(i = s.length()-1,j = 0;i>=0;i--,j++) {
char c = s.charAt(i);
if(c=='6') {
ans[j] = '9';
}else if(c == '9') {
ans[j] = '6';
}else {
ans[j] = c;
}
}
return new String(ans);
}
private static class Price {
int p;// 原价
int plus;// 颠倒价-原价
//
public Price(int p, int plus) {
super();
this.p = p;
this.plus = plus;
}
}
}
总结
1.java的整数转字符串,直接给整数加一个空串。
String s = ""+x;
2.在Java StringBuffer类中有一个Reverse方法,用来对字符串反转,如StringBuffer x=new StringBuffer('helloworld'), 使用Reverse方法后获得新字符串'dlrowolleh'。
本题的反转并不是将这个字符串前后的字母顺序反转,而是将这个字母旋转一百八十度
3.赔了二百多
i1-i<-200&&i1-i>-300
4.竞赛中不可以用其他包,所以新建价格的类要写成私有类。
private static class Price {
int p;// 原价
/**
*
*/
int plus;// 颠倒价-原价
//
public Price(int p, int plus) {
super();
this.p = p;
this.plus = plus;
}
}
生成构造方法快捷键:
5.重复出现的地方我们可以提取成一个变量,这样方便我们反复替换
比如价格这里的i1-i
int plus = i1-i;
replace() 方法通过用 newChar 字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。
语法
public String replace(char searchChar, char newChar)
参数
- searchChar -- 原字符。
- newChar -- 新字符。
返回值
替换后生成的新字符串。
public class Main {
public static void main(String args[]) {
String Str = new String("Runoob");
System.out.print("返回值 :" );
System.out.println(Str.replace('o', 'T'));
System.out.print("返回值 :" );
System.out.println(Str.replace('u', 'D'));
}
}
返回值 :RunTTb
返回值 :RDnoob
7.char 数组变为Sring字符串
char [] ans = new char[s.length()];
String s = new String(ans)
8.reverse逻辑出错
原方法:
//把字符串反转一百八十度
private static String reverse(String s) {
char [] ans = new char[s.length()];
for(int i = 0;i<s.length();i++) {
char c = s.charAt(i);
if(c=='6') {
ans[i] = '9';
}else if(c == '9') {
ans[i] = '6';
}else {
ans[i] = c;
}
}
return new String(ans);
}
测试
System.out.println(reverse("1958"));
输出:
1658
此处逻辑出错,只反转了这个数字并没有反转它在数字中的位置。
比如1958 倒着挂就是:8561
改正:
private static String reverse(String s) {
char [] ans = new char[s.length()];
int j;
int i;
for(i = s.length()-1,j = 0;i>=0;i--,j++) {
char c = s.charAt(i);
if(c=='6') {
ans[j] = '9';
}else if(c == '9') {
ans[j] = '6';
}else {
ans[j] = c;
}
}
return new String(ans);
}
此处一个小技巧就是:
另外定义一个j从0到length-1。
i从左边开始取字符,但是将左边的从0开始存放,原来char c = s.charAt(i)不变,但是ans[i]变为ans[j]
9.筛选合理的数字。如:1 2 5 6 8 9 0 都可以。
if(s.contains("3")||s.contains("4")||s.contains("7")) {
continue;
}
java在contains()方法是判断字符串中是否有子字符串。当且仅当此字符串包含指定的char值序列,如果有则返回true,如果没有则返回false。
10.取字符串的值
int i1 = Integer.parseInt(re_s);
11.观察结果赔钱的只有9088