颠倒的价牌

颠倒的价牌

题干:

小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。

其标价都是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'。

img

本题的反转并不是将这个字符串前后的字母顺序反转,而是将这个字母旋转一百八十度

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;
		}

	}

生成构造方法快捷键:

image-20210310112355048

5.重复出现的地方我们可以提取成一个变量,这样方便我们反复替换

比如价格这里的i1-i

int plus = i1-i;

image-20210310112022614

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

image-20210310115817436

posted @ 2021-03-10 12:00  记录学习Blog  阅读(84)  评论(0编辑  收藏  举报