1、实现字符串反转

提供七种方案实现字符串反转

import java.util.Stack;
public class StringReverse { public static String reverse1(String s) {
int length = s.length();
if (length <= 1)
return s;
String left = s.substring(0, length / 2);
String right = s.substring(length / 2, length);
return reverse1(right) + reverse1(left);
} public static String reverse2(String s) {
int length = s.length();
String reverse = "";
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;
return reverse;
} public static String reverse3(String s) {
char[] array = s.toCharArray();
String reverse = "";
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i]; return reverse;
} public static String reverse4(String s) {
return new StringBuffer(s).reverse().toString();
} public static String reverse5(String orig) {
char[] s = orig.toCharArray();
int n = s.length - 1;
int halfLength = n / 2;
for (int i = 0; i <= halfLength; i++) {
char temp = s[i];
s[i] = s[n - i];
s[n - i] = temp;
}
return new String(s);
} public static String reverse6(String s) { char[] str = s.toCharArray(); int begin = 0;
int end = s.length() - 1; while (begin < end) {
str[begin] = (char) (str[begin] ^ str[end]);
str[end] = (char) (str[begin] ^ str[end]);
str[begin] = (char) (str[end] ^ str[begin]);
begin++;
end--;
} return new String(str);
} public static String reverse7(String s) {
char[] str = s.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < str.length; i++)
stack.push(str[i]); String reversed = "";
for (int i = 0; i < str.length; i++)
reversed += stack.pop(); return reversed;
} }

2、将一个正整数分解质因数

   /*将一个正整数分解质因数
* 每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数
*/ primeFactor();
}
/*
* 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
* (2)如果n>=k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
*/ public static void primeFactor() {// 该方法将一个正整数分解成质因数相乘的形式 Scanner scan = new Scanner(System.in);// 接收控制台输入的信息
System.out.print("请输入一个正整数:"); try {
int num = scan.nextInt();// 取出控制台输入的信息 if (num < ) {// 若输入的数小于2,输出提示信息 System.out.println("必须输入不小于2的正整数!");
} else { int primeNumber = ;// 定义最小的质数
System.out.print(num + " = "); while (primeNumber <= num) {// 在质数小于输入的数时,进行循环 if (primeNumber == num) {// 当质数等于输入的数时,直接输出 System.out.print(num);
break;// 跳出循环 } else if (num % primeNumber == ) {// 当输入的数与质数的余数为0时,输出这个质数 System.out.print(primeNumber + " * ");
num = num / primeNumber;// 把剩下的结果赋给num } else {// 在余数不为0时,质数递增
primeNumber++;
}
}
}
} catch (Exception e) {
System.out.println("必须输入正整数!");// 捕捉异常,输出必须输入整数
}

3、有一段文本,统计其中的单词数 注意:单词间的间隔不一定是一个空格

    @Test1
public void Test1() {
int count = 0;
String sentence ="I am Geng.X.y,she is my girlfriend.Lowood?what is that?";
Scanner s = new Scanner(sentence).useDelimiter(" |,|\\?|\\.");
while(s.hasNext()){
count++;
System.out.println(s.next());
}
System.out.println("这段短文单词的个数是:"+count); String[] strs = {"a", "b", "c"};
for (String str:strs) {
change(str);
System.out.println(str);
}
}

4、计算字符串中单词出现的次数

    @Test
public void test1() {
String str = "i am god god god";
if (str == null)
System.out.println("null");
str = str.trim();
int len = str.length();
if (len == 0)
System.out.println("null");
Map<String, int[]> map = new HashMap<String, int[]>();//用int[]代替了integer,避免了Integer在使用过程中的自动装箱和拆箱,提高了效率
String[] words = str.split("\\s+");
for (int i = 0; i < words.length; i++) {
int[] counts = new int[1];
if (!map.containsKey(words[i])) {
counts[0] = 1;
map.put(words[i], counts);
} else {
counts[0] = map.get(words[i])[0] + 1;
map.put(words[i], counts);
}
}
System.out.println(map.get("god")[0]);
}

5、统计字符串中字母最多的单词

    @Test
public void test() {
String str = "abcdefg123456789asdfgagfafg";
int max = ;
int count = ;
String temp = "";
for (int i = ; i < str.length(); i++) {
String substring = str.substring(i, i + );
if (substring.matches("[a-z]||[A-Z]")) {
count++;
temp += substring;
if (max < count) {
max = count; }
} else {
count = ;
temp = "";
}
}
System.out.println(max + "," + temp); }

6、将一个链表倒序

public class SingleLinkedReverse {

    class Node {
int data;
Node next; public Node(int data) {
this.data = data;
}
}
public static void main(String[] args) {
SingleLinkedReverse slr = new SingleLinkedReverse();
Node head, tail;
head = tail = slr.new Node();
for (int i = ; i < ; i++) {
Node p = slr.new Node(i);
tail.next = p;
tail = p;
}
tail = head;
while (tail != null) {
System.out.print(tail.data);
tail = tail.next;
} head = reverse(head); System.out.println();
while (head != null) {
System.out.print(head.data);
head = head.next;
}
} private static Node reverse(Node head) {
Node p1, p2 = null;
p1 = head; while (head.next != null) {
p2 = head.next;
head.next = p2.next;
p2.next = p1;
p1 = p2;
}
return p2;
}
}

7、生成随机字符串,字符串必须同时包含大小写字母和数字

public class RandomAlphaNumericGenerator {
private static final char[] symbols;
private final Random random = new Random();
private final char[] buf; static {
StringBuilder tmp = new StringBuilder();
for (char ch = ''; ch <= ''; ++ch)
tmp.append(ch);
for (char ch = 'a'; ch <= 'z'; ++ch)
tmp.append(ch);
for (char ch = 'A'; ch <= 'Z'; ++ch)
tmp.append(ch); // 添加一些特殊字符
tmp.append("!@#$%");
symbols = tmp.toString().toCharArray();
} public RandomAlphaNumericGenerator(int length) {
if (length < )
throw new IllegalArgumentException("length < 1: " + length);
buf = new char[length];
} public String nextString() {
for (int idx = ; idx < buf.length; ++idx)
buf[idx] = symbols[random.nextInt(symbols.length)];
return new String(buf);
} public static void main(String[] args) {
RandomAlphaNumericGenerator randomTest = new RandomAlphaNumericGenerator();
System.out.println(randomTest.nextString());
for(int i=;i<;i++){
String result = null;
do {
result = randomTest.nextString();
} while (!result.matches(".*(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%]).*"));
System.out.println(result);
}
System.out.println();
}
}

8、七进制转十进制

 public void test3() {
int num = 0;
String src = "125";
char[] c = src.toCharArray();
for (int i=0; i<c.length; i++) {
num = (num << 3) - num; //也就是 num *= 7;
num += (c[i]-'0');
}
System.out.println(num); String a=Integer.valueOf("125", 8).toString();
System.out.println(a);
}

9、迷宫算法

package com.maze;

/**
* Created by Genesis on 2017/2/8.
*/
public class MiGong {
/**
* 定义迷宫数组
*/
private int[][] array = {
{0, 0, 1, 0, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 1, 0},
{0, 0, 1, 0, 1, 1, 0, 1},
{0, 1, 1, 1, 0, 0, 1, 0},
{0, 0, 0, 1, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 1, 0, 1},
{0, 1, 1, 1, 1, 0, 0, 1},
{1, 1, 0, 0, 0, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0} };
private int maxLine = 8;
private int maxRow = 9; public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
new MiGong().check(0, 0);
System.out.println(System.currentTimeMillis());
} private void check(int i, int j) {
//如果到达右下角出口
if (i == maxRow - 1 && j == maxLine - 1) {
print();
return;
} //向右走
if (canMove(i, j, i, j + 1)) {
array[i][j] = 5;
check(i, j + 1);
array[i][j] = 0;
}
//向左走
if (canMove(i, j, i, j - 1)) {
array[i][j] = 5;
check(i, j - 1);
array[i][j] = 0;
}
//向下走
if (canMove(i, j, i + 1, j)) {
array[i][j] = 5;
check(i + 1, j);
array[i][j] = 0;
}
//向上走
if (canMove(i, j, i - 1, j)) {
array[i][j] = 5;
check(i - 1, j);
array[i][j] = 0;
}
} private boolean canMove(int i, int j, int targetI, int targetJ) {
// System.out.println("从第" + (i + 1) + "行第" + (j + 1) + "列,走到第" + (targetI + 1) + "行第" + (targetJ + 1) + "列");
if (targetI < 0 || targetJ < 0 || targetI >= maxRow || targetJ >= maxLine) {
// System.out.println("到达最左边或最右边,失败了");
return false;
}
if (array[targetI][targetJ] == 1) {
// System.out.println("目标是墙,失败了");
return false;
}
//避免在两个空格间来回走
if (array[targetI][targetJ] == 5) {
// System.out.println("来回走,失败了");
return false;
} return true;
} private void print() {
System.out.println("得到一个解:");
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxLine; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}

10、四舍五入

方法一、
Math.round(12.5)
方法二、
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, RoundingMode.HALF_UP).doubleValue();

11、生成随机数

Random r = new Random();

a 、生成[0,1.0)区间的小数
double d1 = r.nextDouble();
直接使用nextDouble方法获得。 b、生成[0,5.0)区间的小数
double d2 = r.nextDouble() * 5; c、生成[1,2.5)区间的小数 [n1,n2]
double d3 = r.nextDouble() * 1.5 + 1;【也就是 r.nextDouble() * (n2-n1)+n1】

12、在一个字符串中查找第一个非重复的字符

第一个算法实现在getFirstNonRepeatedChar(String str)方法中。它首先获得字符串的字符数组,然后遍历数组并建立一个哈希表,哈希表的键为字符,值为该字符出现的次数。下一步它会遍历LinkedHashMap去找到第一个值为1的元素,那便是第一个非重复的字符,因为LinkedHashMap维护的元素顺序与插入顺序一致,而我们遍历字符数组是从头遍历到尾。这种算法的缺点在于它需要两个循环,第一个循环的次数与字符串的字符个数成正比,而第二个循环的次数与字符串中重复的字符个数成正比。最差的情况是非重复的字符出现在字符串的最尾部,那么这个算法需要2*N的时间去解决这个问题。

第二个算法实现在firstNonRepeatingChar(String word)方法中。这种解决方案可以在一次字符串扫描中找到第一个不重复的字符,它应用了典型的空间时间权衡技术。它使用了两个存储空间来减少一次循环,是标准的空间-时间折衷。由于我们将重复和不重复的字符分开存放,在循环结束后,存放不重复字符的列表中的第一个元素就是我们所要找的第一个非重复字符。这种解决方案稍微优于上一种。如果在字符串中没有不重复的字符,你可以选择返回null或者空字符串。

public class Programming {
public static char getFirstNonRepeatedChar(String str) {
Map<Character, Integer> counts = new LinkedHashMap<Character, Integer>(
str.length());
for (char c : str.toCharArray()) {
counts.put(c, counts.containsKey(c) ? counts.get(c) + 1 : 1);
}
for (Entry<Character, Integer> entry : counts.entrySet()) {
if (entry.getValue() == 1) {
return entry.getKey();
}
}
throw new RuntimeException("didn't find any non repeated Character");
}
public static char firstNonRepeatingChar(String word) {
Set<Character> repeating = new HashSet<Character>();
List<Character> nonRepeating = new ArrayList<Character>();
for (int i = 0; i < word.length(); i++) {
char letter = word.charAt(i);
if (repeating.contains(letter)) {
continue;
}
if (nonRepeating.contains(letter)) {
nonRepeating.remove((Character) letter);
repeating.add(letter);
} else {
nonRepeating.add(letter);
}
}
return nonRepeating.get(0);
}

Java面试常见算法题的更多相关文章

  1. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  2. LeetCode面试常见100题( TOP 100 Liked Questions)

    LeetCode面试常见100题( TOP 100 Liked Questions) 置顶 2018年07月16日 11:25:22 lanyu_01 阅读数 9704更多 分类专栏: 面试编程题真题 ...

  3. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  4. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. java面试| 精选基础题(3)

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 系列文章 java面试| 精选基础题(1) java面试|精选基础题(2) 1.float f=3.4;是否正确? 答:不正确,编译无法通过 ...

  7. java面试| 精选基础题(2)

    关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...

  8. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  9. 面试经典算法题集锦——《剑指 offer》小结

    从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...

随机推荐

  1. 使用PHPExcel-1.8实现导入

    //使用PHPExcel-1.8实现导入(下载PHPExcel-1.8):导入excel 后缀名必须是.xls1.<form method="post" action=&qu ...

  2. java时间格式

    Calendar startdate = Calendar.getInstance(); startdate.setTime(new Date()); //当前时间 startdate.add(Cal ...

  3. Angular5.0.0新特性

    文章来自官网部分翻译https://blog.angular.io/version-5-0-0-of-angular-now-available-37e414935ced Angular5.0.0版本 ...

  4. HBase数据备份及恢复(导入导出)的常用方法

    一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...

  5. AJAX,PHP,前端简单交互制作输入框效果

    PHP数据 <?php // 数据 $arr = array( array("百度", "http://www.baidu.com/"), array(& ...

  6. Problem I

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  7. Maple trees(最小覆盖圆)

    Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. SSH框架的多表查询和增删查改 (方法一)中

    原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html   这边文章是接的刚刚前一遍的基础上敲的  ...

  9. JavaScript组成(三个组成部分)

    JavaScript主要包括三部分: 1.ECMAScript: JavaScript的核心,仅仅是一个描述,定义了脚本语言的所有属性,方法和对象. 具体地,ECMAscript描述了以下内容: 语法 ...

  10. HTML5网页音乐播放器

    1功能介绍 HTML5中推出了音视频标签,可以让我们不借助其他插件就可以直接播放音视频.下面我们就利用H5的audio标签及其相关属性和方法来制作一个简单的音乐播放器.主要包括以下几个功能: 1.播放 ...