`

一道简单的面试题

 
阅读更多

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触摸事件系统的基本理解和应用。 ...

    js面试题面试题面试题

    根据给定的文件信息,以下是对每一道JS面试题的知识点进行详细解析: ### 第一题:编写一个方法求一个字符串的字节长度 #### 解析: 在这道题目中,我们需要编写一个函数来计算字符串的字节长度。这里的重点在于...

    一道微软面试题

    根据给定的信息,我们可以推断出这是一道与算法相关的微软面试题目,主要涉及的是如何在1到100000的范围内寻找一个缺失的数字。从标题和描述来看,这个问题旨在测试应聘者的逻辑思维能力和解决问题的能力。下面将...

    整理C#面试题10套

    "C#面试题10套" 本资源摘要信息涵盖了C#面试题10套,涵盖了C#、.NET、面试题等知识点,详细解释了每一个问题和答案。 问题一: 密码问题,涉及到逻辑思维和规则应用。问题中给出了五个字母K、L、M、N、O,要求在...

    算法面试题实用知识库分享

    这个问题是算法面试题中的一道经典题目,开发者需要掌握这个问题的解决方法。 算法笔记_面试题_2.移动零 本篇笔记主要介绍了移动零问题的解决方法,包括问题分析、解决方法等。这个问题是算法面试题中的一道常见...

    Java 面试题 Java 面试题

    根据给定的文件内容,我们可以总结出一系列与Java面试相关的知识点。下面将详细解析每一道题目涉及的关键概念。 ### 第一部分:基础知识 #### 1. final, finally, finalize的区别 - **final**: 用于声明变量、方法...

    hadoop2面试题 - 2012腾讯笔试的一道算法题.pdf

    ### hadoop2面试题 - 2012腾讯笔试的一道算法题 #### 背景与题目概述 本文档提供了2012年腾讯笔试中一道关于字符串处理的算法题,该题目要求将字符串中的所有大写字母移动到字符串的末尾,同时保持其他字符的相对...

    这是一道广为流传的微软面试题

    本篇文章将详细探讨一道经典的微软面试题——链表的反转,并通过分析其背后的逻辑和技术要点,帮助读者更好地理解和掌握这一问题。 #### 题目背景与解析 题目要求:给定一个链表的头结点,反转该链表,并返回反转...

    软件工程师经典面试题

    11. 这是一道简单的减法计算题。9305 - 5126 - 1107 = 3072,答案是C。 12. 这是一道百分比和小数计算题。4.5的40%加上2/3的Y%等于10的20%,即1.8 + (2/3)*Y% = 2,解得Y% = 30%,所以答案是D。 13. 这是一道年龄...

    暴雪面试题整理

    线程间通信则相对简单,可以直接访问共享内存。 【用户点击网页链接的流程】 用户点击链接后,浏览器解析URL,发起HTTP/HTTPS请求到服务器。服务器接收到请求后,处理请求,可能涉及到动态脚本执行、数据库查询等,...

    Golang 面试题汇编

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

    百度面试题大收集算法

    这是一道经典的二维数组处理问题,可以应用Kadane's algorithm进行解决,寻找连续子数组的最大和。对于01矩阵,目标是找到连续的1的最大数量。 6. **判断点分十进制IP合法性**: IP地址是四个0-255之间的数字,用...

    vcc软件软件工程师面试题[文].pdf

    首先,让我们来看一道常见的面试题——实现一个`strcpy`函数。`strcpy`函数在C/C++编程中扮演着基础且重要的角色,用于复制字符串。面试官可能会要求面试者现场编写这个函数,以此来评估面试者的编程基础和对内存...

    C/C++程序员应聘常见面试题深入剖析

    通过这些面试题,我们可以看到,即使是看似简单的编程任务,也需要全面考虑多种因素。对于面试者来说,不仅要扎实掌握基础知识,还要具备问题分析和解决的能力。只有这样,才能在面试中展现出自己的专业素养和技术...

    高质量c++(内含面试题)

    - **简单应用程序命名规则**:根据不同的操作系统环境,制定相应的命名规范。 #### 四、表达式和基本语句 - **运算符优先级**:理解不同运算符的优先级顺序,合理使用括号以明确计算过程。 - **复合表达式**:在单...

    一道华为的面试题 关于JAVA来的

    根据给定的信息,本文将详细解析这道华为的面试题,并深入探讨其涉及的Java编程技巧及相关的知识点。 ### 领域背景 在软件开发过程中,字符串处理是非常常见的任务之一。无论是处理配置文件、JSON数据还是其他类型...

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

    首先,让我们看一个简单的例子: ```javascript var i = 0; var result = fn(); function fn() { console.log(result); i++; } ``` 这个例子中,我们定义了一个函数 `fn`,它将在调用时输出当前的 `result` 值,...

    golang面试题集合.zip

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

    CC++程序员应聘常见面试题.docx

    首先,让我们来看一道经典的面试题——手动实现`strcpy`函数。`strcpy`函数是C语言中用于复制字符串的库函数,它的正确实现是衡量一个C/C++程序员基本功的重要指标。题目1中,面试者被要求在有限的内存空间内复制...

    微软面试100题

    面试题1:水杯与玻璃杯的区别 在软件开发中,“水杯”与“玻璃杯”的类比,可以引申为抽象类与具体类的关系。抽象类定义了类的基本属性和方法,但不能实例化,而具体类则继承自抽象类,实现了抽象类中定义的所有...

Global site tag (gtag.js) - Google Analytics