看似简单,实际上还是有点复杂的面试题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Aokiboy/article/details/92849235

算是面试总结吧,对于我这种小白来说,当时是没有思路的,但是今天面试的时候就这个题让我头疼。

大概题目:

有两个表,表1为详细表,分别有三个字段,detailid,datailtype,remark。表2为产品表,有两个字段分别是productid,productname。

要求:

把表1中的detailtype字段所有信息变成对应的表2中的productname字段(语言不限)。

表1
detailid detailtype remark
101 产品详细1 备注1
102 产品详细2 备注2
103 产品详细3 备注3
104 产品详细4 备注4
19999 产品详细19999 备注19999

 

表2
productid productname
101 产品1
102 产品2
103 产品3
104 产品4
19999 产品19999

 

题目已经描述完,我以为就是一个Update就能完事,没想到想了半天没有想出来,结果面试机会都没有给,我是真的想说当时真的没有思路,蒙圈的一B,于是这场面试就此告终啦,有点遗憾!回家后一直琢磨这道题,想来想去,是用子查询还是什么,但是以前没有写过同时修改N个数据的SQL语句啊,于是自己在电脑上敲,最后结合Java语言终于实现了修改多项数据的这道题,算是长见识啦,深深的给出题的人鞠个躬。记录于此,以作警钟。

重要的事情我想说三句:老板,这就是你要的代码,老板,这就是你要的代码,老板,你就是你要的代码。

import java.sql.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class TsetMain {

    public static void main(String args[]) throws SQLException {
        HashMap hs = TsetMain.getProduct();
        Connection con = DBUtil.ConnectDB();
        int result=0;
        Iterator it = hs.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
            String sql = "update detail set typename=? where detailid=?";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, entry.getValue());
            ps.setString(2, entry.getKey());
            result = ps.executeUpdate();
        }
        if (result > 0) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败");
        }
    }

    public static HashMap<String, String> getProduct() throws SQLException {
        HashMap<String, String> hm = new HashMap();
        Connection conn = DBUtil.ConnectDB();

        String sql = "select productid,productname from product";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet != null) {
            while (resultSet.next()) {
                String productid = resultSet.getString("productid");
                String productname = resultSet.getString("productname");
                hm.put(productid, productname);
            }
        }
        DBUtil.releaseDB(preparedStatement, resultSet);
        return hm;
    }
}

以上代码能实现题目要求的功能,这只是我自己的理解,仅代表自己观点,如果有其他意见的朋友,可以给我发一个更简单的。

展开阅读全文

两道看似简单面试题,通过率为0

09-19

昨天和同事面试了十几个求职者,大部分人简历上写的是培训班出来的,科班的也有几个。同事现场发挥出了两道题,要求他们现场编程实现一下,我看了下他出的题,第一反应是这小子可真狠,挖了那么大一个大坑给别人跳。废话不多说上题:rn rn 以下题目可以采用自己熟悉的任意语言进行描述: rnrn 第一道题:已知有一家化工厂,日常生产的商品有5种类型,商品名称分别为硫酸(编号001),硝酸(编号002),盐酸(编号003),氢氟酸(编号004)和硫酸亚铁(编号005)。要求编写一个函数用以描述以下内容,通过输入商品名称返回对应的商品编号;rnrn 第二道题:编写一个函数,如果参数输入为“男性”时返回true,如果为“女性”时返回false。(按照中国现行法律考虑,不用考虑其他性别);rnrn 就是这样两道看似极其简单的题,第一道题虽然全部都描述正确了,但是也仅仅只是描述正确而已,从代码看起来没有一个人明白这道题的真正用意。第二道题全部通过了。但是只有两道题都通过才算真正的清楚出题人到底是想考察些什么。其实同事想让他们明白什么时候不应该去过度设计。rnrn 其实我看了第一道题以后,我就估计这次有90%的人要被Pass掉,因为如果只是使用if+else来写的话,就正好掉坑里了。我也不知道他们为什么设计之前不问问自己,如果这样设计的话,日后工厂商品种类增加了或者某个商品的编号改变了怎么办?打开function直接改?既然都已经意识到了函数内部有这样的变化,为什么不去抽象这个变化。然而很遗憾没有一个人使用KeyValuePairs去分离这个变化,当商品种类增加或改变时,直接注册键值对到散列表里或者修改散列表键对应的值就可以了,而不是去修改function。rnrn 再看第二道题,恰恰告诉我们不要去过度设计,因为这里描述的性别除了两种没有其他的可能性(按照中国法律),返回的值改变的可能性也是极低的,用最简单的if+else就可以了。rnrn 大家可以一起讨论讨论rn rn 论坛

一个有点复杂的问题!!!!!!!!!!!!!!

12-05

import javax.swing.*;rnimport java.awt.event.*;rnimport java.awt.*;rnrnclass FrameDemorn FirstFrame first=new FirstFrame();rn SecondFrame second=new SecondFrame();rn class FirstFrame extends JFramern JTextField jTextField;rn JButton jButton;rn public FirstFrame()rn jTextField=new JTextField(5);rn jButton=new JButton("下一步");rn rn getContentPane().setLayout(new BorderLayout());rn getContentPane().add(jTextField,"Center");rn getContentPane().add(jButton,"South");rn jButton.addActionListener(this);rn addWindowListener(new WindowAdapter()rn public void windowClosing(WindowEvent e)rn System.exit(0);rn rn );rn setSize(200,300);rn rn public void actionPerformed(ActionEvent e)rn second.show();rn first.setVisible(false);rn rn rn class SecondFrame extends JFrame implements ActionListenerrn JLabel jLabel1;rn JLabel jLabel2;rn String s=first.jTextField.getText();rn public SecondFrame()rn jLabel1=new JLabel("your input in first frame is:");rn jLabel2=new JLabel(s);rnrn getContentPane().setLayout(new FlowLayout());rn getContentPane().add(jLabel1);rn getContentPane().add(jLabel2);rn rn addWindowListener(new WindowAdapter()rn public void windowClosing(WindowEvent e)rn System.exit(0);rn rn );rn setSize(200,300);rn rn rn public static void main(String[] args)rn first.show();rn rnrn我想要做的是:rnrn第一个frame有一个textfield 和一个jbutton,执行button的时候rn让第二个frame里面的一个jlabel能够显示第一个frame里面的textfield里面的东西rn为什么这个不行,该如何修改。。rn还有没有其他的方法能够实现呢?rn请教高人指点!!!!!!!!!!!!!!!!!!!!!!!!1rnrn 论坛

表复制求助,有点复杂

12-18

文字描述场景:rn物料表parts_3rn物料工序表part_process_3rn物料名称parts_3.name 字段内容一样的话,这个物料的工序信息就是一样的。rn所以我在工序表里面做了相同名称的物料,其中一个的工序信息。rn我希望写一句SQL能够让相同物料名称的物料工序信息能够复制进工序表part_process_3rn测试数据和需要的结果如下:rnCREATE TABLE [dbo].[PART_PROCESS_3](rn [ID] [int] IDENTITY(1,1) NOT NULL,rn [code] [int] NOT NULL,rn [工序编号] [nvarchar](max) NOT NULL,rn [工序名称] [nvarchar](max) NOT NULL,rn rn) ON [PRIMARY]rnCREATE TABLE [dbo].[PARTS_3](rn [ID] [int] IDENTITY(1,1) NOT NULL,rn [CODE] [nvarchar](max) NOT NULL,rn [NAME] [nvarchar](max) NOT NULL,rn [SPECIFICATION] [nvarchar](max) NOT NULL,rn [DESCRIBE] [nvarchar](max) NULLrn) ON [PRIMARY]rnrninsert into parts_3(code,name,SPECIFICATION,DESCRIBE) select '200018', '电磁铁', 'V5210.2-03', ''rninsert into parts_3(code,name,SPECIFICATION,DESCRIBE) select '200070', '电磁铁', 'V5110.2-03', ''rninsert into parts_3(code,name,SPECIFICATION,DESCRIBE) select '200352', '电磁铁', '0',''rninsert into parts_3(code,name,SPECIFICATION,DESCRIBE) select '200015','活塞', 'V5210.2-00','' rninsert into parts_3(code,name,SPECIFICATION,DESCRIBE) select '200067', '活塞', 'V5110.2-00','' rnrninsert into part_process_3 (code,工序编号,工序名称) select '200018','op1','电磁铁工序一'rninsert into part_process_3 (code,工序编号,工序名称) select '200018','op2','电磁铁工序二'rninsert into part_process_3 (code,工序编号,工序名称) select '200018','op3','电磁铁工序三'rninsert into part_process_3 (code,工序编号,工序名称) select '200015','op4','活塞工序一'rninsert into part_process_3 (code,工序编号,工序名称) select '200015','op5','活塞工序二'rnrn最终的结果rn200018 op1 电磁铁工序一rn200018 op2 电磁铁工序二rn200018 op3 电磁铁工序三rn200015 op4 活塞工序一rn200015 op5 活塞工序二rn200070 op1 电磁铁工序一rn200070 op2 电磁铁工序二rn200070 op3 电磁铁工序三rn200052 op1 电磁铁工序一rn200052 op2 电磁铁工序二rn200052 op3 电磁铁工序三rn200067 op4 活塞工序一rn200067 op5 活塞工序二 论坛

一个有点复杂的问题

04-28

作业的要求是把一个我自己写的DLL注入到一个需要用到winsock.dll的程序中去,然后替换掉connect,send,recv和disconnect函数,当这些函数被调用的时候,将send和recv的数据传送到另外一个命令行进程中去,并通过命令行输出。注意是命令行。。 rnrn我现在把DLL成功的注入进去了,也成功替换了那些函数,但是没办法把数据传送到另外的命令行进程中去。。 我想要用内存映射,但是找不到很好的办法对内存进行监听。。rnrn以下是我创建的进程的代码,可能有点儿乱,不好意思。。rnint _tmain(int argc, _TCHAR* argv[])rnrnrn LPCWSTR filename=L"filename";rnrn HANDLE hFile=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE, NULL,OPEN_EXISTING,NULL,NULL);rn if(hFile==NULL)rn rn printf(("Could not create file (%d).\n"),GetLastError()); rn rn HANDLE hFileMap=CreateFileMappingrn (hFile,rn NULL, // default security rn PAGE_READWRITE , // read/write accessrn 0, // maximum object size (high-order DWORD) rn 256, // maximum object size (low-order DWORD) rn filename); // name of mapping objectrn if(hFileMap==NULL)rn rn printf(("Could not create mapped file (%d).\n"),GetLastError());rn rn rn rn HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,_T("filename"));rn LPTSTR lpMapAddr;rn if (m_hMapFile)rn rn LPTSTR lpMapAddr = (LPTSTR) MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,256);rn /*TCHAR *pDataG;rn memcpy(pDataG,lpMapAddr);*/ rn rn LPTSTR pData=L"x";rn LPTSTR pv=L"Welcome:";rn for(int i=0;i<7;i++)rn rn printf("%s",lpMapAddr);rn lpMapAddr;rn rn CopyMemory((PVOID)lpMapAddr, pData, (_tcslen(pData) * sizeof(TCHAR)));rn /*wmemcpy((TCHAR *)&lpMapAddr,pData,sizeof(pData));*/rn bool bDone=true;rn while(bDone)rn rnrn if( *(lpMapAddr)!=*pData)rn rn for(int i=0;i<8;i++)rn rn printf("%s",lpMapAddr);rn lpMapAddr++;rn rn printf("\n");rn CopyMemory((PVOID)lpMapAddr, pData, (_tcslen(pData) * sizeof(TCHAR)));rn rn Sleep(2000);rn rn rn rn /* UnmapViewOfFile(lpMapAddr);rnrn CloseHandle(m_hMapFile);*/rnrn return 0;rnrnrn以下我我创建的recv1函数的代码:rnextern "C" __declspec(dllexport)rnint WINAPI recv1(SOCKET s, char FAR *buf, int len, int flags ) rn rn rn HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,_T("filename"));rn LPTSTR lpMapAddr;rn if (m_hMapFile)rn rn lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);rn if(lpMapAddr==NULL)rn rn printf(("Could not view mapped file (%d).\n"),GetLastError());rn return recv(s,buf,len,flags); rn rn LPTSTR pData=L"Recieved";rn wcscpy(lpMapAddr,pData);rn printf("sended to another process");rn rn rn /*wchar_t *pData=MultiByteToWideChar(*/rn //if(buf!='\0')rn //rn // //::MessageBox(NULL,(LPCWSTR)pData,L"RemoteThread",0);rn // CopyMemory((PVOID)pBuf, pData, (_tcslen(pData) * sizeof(TCHAR)));rn //rn /* wcscpy(pBuf,pData);*/rn UnmapViewOfFile(lpMapAddr);rnrn CloseHandle( m_hMapFile);rnreturn recv(s,buf,len,flags); rnrnrn各位大哥有什么思路尽管留言。。。我是真的没有办法了。。。 论坛

没有更多推荐了,返回首页