`

一道简单的面试题

 
阅读更多

1.问题描述

有如下规律的数字串:

① 1
② 11                ①中有1个1
③ 21                ②中有2个1
④ 1211            ③中有1个2,1个1
⑤ 111221        ④中有1个1,1个2,2个1
⑥ 312211        ⑤中有3个1,2个2,1个1
⑦ 13112221
⑧ 1113213211

    …

假设任一数字串的长度都不小于它前面的串,比如⑦的长度大于⑥的,越往后推导得到的串越长。

 

给定两个数字串str1和str2,其中str1是属于上面中的某一串,str2是随机给的数字串,写一个函数判断判断str2是否也上面中的某一串,函数形如bool function(str1,str2),是返回true,否则返回false。

2.解决方案

本来以为这题有什么窍门,当时想了半天都没发现有什么简便的方法,而且时间很紧,要在纸上手写代码,String类的函数也不太记得,没弄出来,面试就这样被鄙视了。最笨的方法是用给定的str1一级级的推导,先比较str1和str2的长度,如果str2的长度比str1小,说明它可能是str1前面的某一串,用str1往前推,将推导出的串与str2比较看是否相等,反之往后推。这道题主要是为了考察手写代码的能力,并不是找窍门,我路子走偏了。下面是笨方法的代码实现,敬请批评指正:

 

/*	1
 * 	1 1
 * 	2 1
 * 	1 2 1 1
 * 	1 1 1 2 2 1
 * 	3 1 2 2 1 1
 * 	1 3 1 1 2 2 2 1
 * 	...
 * 
 * */
public class Test {
	
	//对给定的有规律的数字串推出下一个串
	public static String nextString(String str) {
		char tmp = str.charAt(0);
		int i = 1;
		int j = 1;
		StringBuffer sbf= new StringBuffer();
		while(i < str.length()) {
			if(tmp == str.charAt(i)) {
				i++;
				j++;
			} else {
				sbf.append(String.valueOf(j)).append(tmp);
				tmp = str.charAt(i);
				i++;
				j = 1;
			}
		}
		sbf.append(String.valueOf(j)).append(tmp);
		return sbf.toString();
	}
	
	//对给定的有规律的数字串推出它前面的串
	public static String previousString(String str) {
		StringBuffer sbf= new StringBuffer();
		for(int i = 0; i < str.length(); i = i + 2) {
			char tem = str.charAt(i + 1);
			int num = Integer.parseInt(String.valueOf(str.charAt(i)));
			while(num > 0) {
				sbf.append(tem);
				num--;
			}
		}
		return sbf.toString();
	}
	
	public static boolean test(String str1, String str2) {
		boolean flag = false;
		if(str1.length() == str2.length()) {
			if(str1.equals(str2) || previousString(str1).equals(str2)
					|| nextString(str1).equals(str2)) {
				flag = true;
			}
		} else if(str1.length() > str2.length()) {
			String tempString =  previousString(str1);
			while(tempString.length() >= str2.length()) {
				if(tempString.equals(str2)) {
					flag = true;
					break;
				} else {
					tempString = previousString(tempString);
				}
			}
		} else {
			String tempString = nextString(str1);
			while(tempString.length() <= str2.length()) {
				if(tempString.equals(str2)) {
					flag = true;
					break;
				} else {
					tempString = nextString(tempString);
				}
			}
		}
		return flag;
	}
	
	public static void main(String[] args) {
		System.out.println(test("312211","111221"));
		System.out.println(test("312211","11"));
		System.out.println(test("21","111221"));
		System.out.println(test("21","11122"));
		System.out.println(test("111221","12"));
	}
}

 

0
2
分享到:
评论

相关推荐

    cocos2d-x 一道简单面试题,触摸事件的重新分发

    有关cocos2d-x面试的题目,以解决网上面试题目少的问题!

    Golang 面试题汇编

    记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行读写,会怎么样?为什么? 简单聊聊内存逃逸? 字符串转成byte数组,会发生内存拷贝吗? http包的内存泄漏 sync.Map 的用法 Golang 理论 Go...

    golang面试题集合.zip

    记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行读写,会怎么样?为什么? 简单聊聊内存逃逸? 字符串转成byte数组,会发生内存拷贝吗? http包的内存泄漏 sync.Map 的用法 Golang 理论 Go...

    微软面试题(本人苦心收集,附有答案)

    (注意,这不是什么标准时间,相信所有浏览本试卷的朋友都会在某一道或多道题上找到灵感,迅速解题的) 一.最基本题型(说明:此类题型比较简单) 1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干...

    2018年最全Java面试通关秘籍第四套

    因此,看到这里,我希望每一位小伙伴不是把这篇文章简单的丢进收藏夹里边,为了你的升职加薪,请好好对待每一道题目!每一题都可能成为你以后的绊脚石! 不要问我为什么没答案了,原因还是以前那句话,单纯的背面...

    一道优雅面试题分析js中fn()和return fn()的区别

    在js中,经常会遇到在函数里调用其它函数的情况,这时候会有 fn() 这种调用方式,...这是一道隐藏了坑的面试题,看似很简单,大部分人可能想都不想就答出了10。而实际上运行可知打印出来的是 undefined。这道陷阱题很

    程序员面试题狂想曲:第七章、求连续子数组的最大和

    希望更多的人能和我一样,把本狂想曲系列中的任何一道面试题当做一道简单的编程题或一个实质性的问题来看待,在阅读本狂想曲系列的过程中,希望你能尽量暂时放下所有有关面试的一切包袱,潜心攻克每一道“编程题”,...

    interview-go:golang面试题集合

    记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行读写,会怎么样?为什么? 简单聊聊内存逃逸? 字符串转成byte数组,会发生内存拷贝吗? http包的内存泄漏 Golang 理论 Go语言的GPM调度器是...

    看似简单的一道SQL面试题,你是否能够很快写出答案?

    近期在群里面看到了如下这样一个面试题目,这个题目其实难度不大,但是你是否能够很快写出这个答案来呢? 建表语句 create table student ( id varchar(20), name varchar(20), gender char(1), birth ...

    探究一道价值25k的蚂蚁金服异步串行面试题

    朋友去面试蚂蚁金服,遇到了一道面试题,乍一看感觉挺简单的,但是实现起来发现内部值得一提的点还是挺多的。 先看题目: const delay = (ms) =&gt; new Promise((resolve) =&gt; setTimeout(resolve, ms)); const ...

    jsp+servlet+mysql+mvc模式增删改查面试题

    面试的一道小题目。jsp,servlet,用mvc模式写的一个简单的增删改查,数据库是mysql 5.0,jdk1.7 myeclipse.有数据库包,有代码。写的一般只能提供学习。

    c++面试题字符串拷贝函数示例

    个也算是企业招工里面比较常见的一道笔试面试题了,非常简单。个人觉得考的主要是对指针使用的熟练程度,还有对字符串类内部原理的掌握程度

    简单图形游戏界面示例

    一个简单图形游戏界面示的例 适合初学者参考 这是一道面试题

    分享几道你可能遇到的python面试题

    本文主要给大家介绍的是关于最近在面试中遇到的几个python面试题,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一、生成斐波那契数列并取前10项 def func(m): n,a,b = 0,1,1 while n &lt; m:...

    SQL面试题:求时间差之和(有重复不计)

    面试某某公司BI岗位的时候,面试题中的一道sql题,咋看一下很简单,写的时候发现自己缺乏总结,没有很快的写出来。 题目如下: 求每个品牌的促销天数 表sale为促销营销表,数据中存在日期重复的情况,例如id为1的...

    从C#中的数组中删除指定元素的几种方法,超简单

    最近小编同事面试遇到了一道面试题,题目是有个int数组,把输入包含的指定元素删除。这道题主要考察C#基础知识和编码动手能力。小编将以如下几种方法实现,供大家参考。(注:文末还有扩展问题。)

    leetcode答案-leetcode-tencent:leetcode面试-腾讯专题做题记录

    leetcode面试-腾讯专题做题记录 LeetCode腾讯专题地址, 小目标 每天至少一道算法题 每天更新README学习markdown写法(不会真的有人不会markdown吧,不会吧,不会吧) 先这样,有什么想到的再说 1月20日 正式开始,...

    java面试题之try中含return语句时代码的执行顺序详解

    主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。

    面试官刁钻的考试题下载

    这是生肖迷宫工作室为吸引高智商人才而特别设计的一道智力题,5个福娃吃5个奥运蛋糕,1只福娃吃掉1个蛋糕需要60分钟,怎样才能确定一段30分钟的时间,太简单了,那么10分钟呢?还不难吧,但是9.5分钟呢?最后如何...

    Calculator

    本Calculator(计算器)是一道面试题,如果简单的用面向过程的方法几分钟就可以实现,但是这样却大打折扣。如果写成现在这样,就可以给你的面试增加不少含金量,确保你通过。 采用最新C#2.0技术开发,采用了简单...

Global site tag (gtag.js) - Google Analytics