JAVA 习题

来源:互联网 发布:gps导航软件下载 编辑:程序博客网 时间:2024/05/18 04:55
题目:给定一个文件和一个字符串,判断文件是否包含该字符串,如果包含,请打印出包含该字符串的行号以及该行的全部内容。
思路: ①使用缓冲流(BufferedReader)读取文件,定义初始行号为0。


                ②遍历文件每一行并判断,包含则将行号和行内容存入hashMap中,行号作为key,行内容作为value.最后遍历hashMap即可


下面是实现的代码:


package com.sgl.io; 
   
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
   
public class FileFindString { 
    public static void findStringInFile(String fileName, String subStr) 
            throws Exception { 
        BufferedReader br = new BufferedReader(new FileReader(fileName)); 
        Map<Integer, String> res = new HashMap<>(); 
        int lineNum = 0; //记录行号 
        String line; 
        while ((line = br.readLine()) != null) { 
            lineNum++; 
        //  第一种:contains 
        //  if (line.contains(subStr)) { 
        //      res.put(lineNum, line); 
        //``} 
        //  第二种:indexOf 
            if(line.indexOf(subStr)!=-1){ 
                res.put(lineNum, line); 
            } 
        } 
        //遍历hashMap,key为行号,value为字符串 
        if (res.isEmpty()) { 
            System.out.println("文件【" + fileName + "】中没有【" + subStr + "】子串"); 
        } else { 
            Iterator<Entry<Integer, String>> it = res.entrySet().iterator(); 
            while (it.hasNext()) { 
                Entry<Integer, String> entry = it.next(); 
                System.out.println("第" + entry.getKey() + "行:\t" 
                        + entry.getValue()); 
            } 
        } 
        br.close(); 
    } 
   
    public static void main(String[] args) throws Exception { 
        findStringInFile("test1.txt", "time"); 
    } 
   


N阶平面魔方:

import java.util.Scanner;  
  
public class MoFang {  
    public static void main(String[] args) {  
        System.out.println("输入行(列)数:");  
        Scanner sc = new Scanner(System.in);  
        int n = sc.nextInt();  
  
        int[][] a = new int[n][n];  
        int i = 0;  
        int j = n / 2;  
          
        //算法精要  
        for (int k = 1; k <= n * n; k++) {  
            a[i][j] = k;  
              
            if (k % n == 0) {  
                i = (i + 1) % n;  
            } else {  
                i = (i - 1 + n) % n;  
                j = (j + 1 ) % n;  
            }  
        }  
          
        for (int k = 0; k < a.length; k++) {  
            for (int r = 0; r < a[k].length; r++) {  
                System.out.print(a[k][r] + "\t");  
            }  
            System.out.println();  
        }  
    }  
}  




单链表

目录

1.单链表反转

2.找出单链表的倒数第4个元素

3.找出单链表的中间元素

4.删除无头单链表的一个节点

5.两个不交叉的有序链表的合并

6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。

写程序把这个二级链表称一级单链表。

7.单链表交换任意两个元素(不包括表头)

8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?

9.判断两个单链表是否相交

10.两个单链表相交,计算相交点

11.用链表模拟大整数加法运算

12.单链表排序

13.删除单链表中重复的元素


这些题目在面试中经常出现,所以在这个专题中总结一下,

我所使用的代码都是C/C++。

会写一些思路,这样就不必看代码了。

冰冻三尺,非一日之寒,让我们慢慢来练习吧。


链表的节点定义如下:

[cpp] view plain copy
 print?
  1. struct node  
  2. {  
  3.     char val;  
  4.     node * next;  
  5. };  

用结构体定义,而不是用类。

从使用的方便来说,类要更好一些,

但是为了和其他关于链表的地方保持一致还是使用了结构体来定义。

节点元素为char型,是为了输出和调试方便。


注:这些题目都是前人总结的。


总结:

1,使用指针时,一定要检查指针是否为空;

2,要考虑特殊情况,如指针为空,空链表(只有表头结点),只有一个结点等;

3,插入,删除,交换等操作时都需要使用当前结点的前驱,需要同时记录下来;

4,单链表有无环以及交叉链表求相交结点的两个题目有很大的联系,

也是经常考的题目,有些题目可以转化成这类题目;

5,递归思想很重要,在链表的倒序输出,反转,模拟大数相交,

快速排序中都有用到,分治算法往往需要用递归来做;

6,快慢指针的思想很重要,常数时间删除结点的算法也很考察智力



http://blog.csdn.net/huangxy10/article/details/8010810


原创粉丝点击