最近有人要求我为工作中的问题提交解决方案。
问题 :在字符串中找到子字符串。
Input: "Little star's deep dish pizza sure is fantastic." Search: "deep dish pizza" Output: "Little star's [[HIGHLIGHT]]deep dish pizza[[ENDHIGHLIGHT]] sure is fantastic."
请注意,在 您的 示例中,荧光笔不必具有完全相同的结果,因为 您 要定义一个好的代码片段并返回最相关的代码片段,并突出显示查询词。
最重要的要求是像编写 生产代码 一样编写它。
我的解决方案未被接受。我该如何改善?我知道,我可以使用:
我的问题:
科技公司在审查工作代码时应考虑哪些因素。我是在同一天提交代码的,对您有帮助吗?
它指出,在其中的一条评论中,它看起来像是学校代码而不是生产代码。怎么样?有什么建议?
我的解决方案: FindSubString.java
/** * FindSubString.java: Find sub-string in a given query * * @author zengr * @version 1.0 */ public class FindSubstring { private static final String startHighlight = "[[HIGHLIGHT]]"; private static final String endHighlight = "[[ENDHIGHLIGHT]]"; /** * Find sub-string in a given query * * @param inputQuery: A string data type (input Query) * @param highlightDoc: A string data type (pattern to match) * @return inputQuery: A String data type. */ public String findSubstringInQuery(String inputQuery, String highlightDoc) { try { highlightDoc = highlightDoc.trim(); if (inputQuery.toLowerCase().indexOf(highlightDoc.toLowerCase()) >= 0) { // update query if exact doc exists inputQuery = updateString(inputQuery, highlightDoc); } else { // If exact doc is not in the query then break it up String[] docArray = highlightDoc.split(" "); for (int i = 0; i < docArray.length; i++) { if (inputQuery.toLowerCase().indexOf(docArray[i].toLowerCase()) > 0) { inputQuery = updateString(inputQuery, docArray[i]); } } } } catch (NullPointerException ex) { // Ideally log this exception System.out.println("Null pointer exception caught: " + ex.toString()); } return inputQuery; } /** * Update the query with the highlighted doc * * @param inputQuery: A String data type (Query to update) * @param highlightDoc: A String data type (pattern around which to update) * @return inputQuery: A String data type. */ private String updateString(String inputQuery, String highlightDoc) { int startIndex = 0; int endIndex = 0; String lowerCaseDoc = highlightDoc.toLowerCase(); String lowerCaseQuery = inputQuery.toLowerCase(); // get index of the words to highlight startIndex = lowerCaseQuery.indexOf(lowerCaseDoc); endIndex = lowerCaseDoc.length() + startIndex; // Get the highlighted doc String resultHighlightDoc = highlightString(highlightDoc); // Update the original query return inputQuery = inputQuery.substring(0, startIndex - 1) + resultHighlightDoc + inputQuery.substring(endIndex, inputQuery.length()); } /** * Highlight the doc * * @param inputString: A string data type (value to be highlighted) * @return highlightedString: A String data type. */ private String highlightString(String inputString) { String highlightedString = null; highlightedString = " " + startHighlight + inputString + endHighlight; return highlightedString; } }
TestClass.java
/** * TestClass.java: jUnit test class to test FindSubString.java * * @author zengr * @version 1.0 */ import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class TestClass extends TestCase { private FindSubstring simpleObj = null; private String originalQuery = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny."; public TestClass(String name) { super(name); } public void setUp() { simpleObj = new FindSubstring(); } public static Test suite(){ TestSuite suite = new TestSuite(); suite.addTest(new TestClass("findSubstringtNameCorrect1Test")); suite.addTest(new TestClass("findSubstringtNameCorrect2Test")); suite.addTest(new TestClass("findSubstringtNameCorrect3Test")); suite.addTest(new TestClass("findSubstringtNameIncorrect1Test")); suite.addTest(new TestClass("findSubstringtNameNullTest")); return suite; } public void findSubstringtNameCorrect1Test() throws Exception { String expectedOutput = "I like fish. Little star's deep [[HIGHLIGHT]]dish pizza[[ENDHIGHLIGHT]] sure is fantastic. Dogs are funny."; assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "dish pizza")); } public void findSubstringtNameCorrect2Test() throws Exception { String expectedOutput = "I like fish. Little star's [[HIGHLIGHT]]deep dish pizza[[ENDHIGHLIGHT]] sure is fantastic. Dogs are funny."; assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "deep dish pizza")); } public void findSubstringtNameCorrect3Test() throws Exception { String expectedOutput = "Hello [[HIGHLIGHT]]how[[ENDHIGHLIGHT]] are [[HIGHLIGHT]]you[[ENDHIGHLIGHT]]r?"; assertEquals(expectedOutput, simpleObj.findSubstringInQuery("Hello how are your?", "how you")); } public void findSubstringtNameIncorrect1Test() throws Exception { String expectedOutput = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny."; assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "I love Ruby too")); } public void findSubstringtNameNullTest() throws Exception { String expectedOutput = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny."; assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, null)); } }
一些评论;
findSubstringInQuery
inQuery
highlight
highlightIgnoreCase
searchTerm
text
System.out.println()
trim()
我不会担心搜索所用的算法,Knuth-Morris-Pratt看起来不错,但是除非工作规范特别要求字符串搜索的经验/专长,否则他们不希望您知道并实现它。