面试题精选(二)

数组

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是 O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组 1、2、4、7、11、15 和数字 15。由于 4+11=15,因此输出 4 和 11。

由于是有序的,可以用双指针来做。第一个指针i指向a[0],第二个j指向a[n-1],
若a[i]+a[j]>v,j--;
若a[i]+a[j]<v,i++;
若a[i]+a[j]=v,结束。

#include <iostream>
using namespace std;
void find(int a[],int n,int v)
{
	int i=0;
	int j=n-1;
	while(i<j )
	{
		if(a[i]+a[j]<v)
		{
			i++;
		}
		else if(a[i]+a[j]>v)
		{
			j--;
		}
		else
		{
			cout<<a[i]<<" + "<<a[j]<<" = "<<v<<endl;
			return;
		}
	}
}
void main()
{
	int a[10]={1,3,6,8,11,13,15,17,20,22};
	find(a,10,4);
	system("pause");
}


二叉树

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

题目分析:可以用一个LinkedList的数据结构模拟队列来完成此操作。传入树的根节点root。
  1.如果root为空则结束交换,否则root 入队。
  2.当队列不为空时进行如下操作:
    a.队首元素出队,交换队首元素节点的左右孩子。
    b.如果队首元素的左孩子不为空,左孩子节点入队;如果队首元素的右孩子不为空,右孩子节点进栈。

算法实现:

//层序遍历,使用LinkedList数据结构来模拟队列
    private void levelOrder(Node root){
        if(root==null){
            System.out.println("\n二叉树为空!");
            return;
        }
        System.out.println("\n这是二叉排序树的层序遍历结果:");
        LinkedList<Node> queue = new LinkedList<Node>();
        queue.add(root);      //根节点先入队
        while(queue.size()!=0){
            Node node = queue.removeFirst();  //得到并删除队列的第一个节点
            System.out.print(node.data+" ");
            if(node.left!=null){   //该节点的左孩子入队
                queue.add(node.left);
            }
            if(node.right!=null){   //该节点的右孩子入队
                queue.add(node.right);
            }
        }
        System.out.println();
    }


字符串


题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

解题思路:对于一般字符串或整数数组是否存在某对象,或者判断对象个数问题,都可以利用hashtable来完成,这里,我们利用数组构建一个简单的hashtable,第一次遍历字符串,记录每个字符出现的次数;第二次遍历记录个数的数组,找到第一个值为1的位置对应的字符,就是本题所求的字符,代码如下:

#include <stdio.h>
#include <memory.h>

char firstSingle(char *str){
    int arr[256];
    char *pt = str;
    if (*pt == '\0'){
        return '\0';
    }
    memset(arr,0,sizeof(arr));
    while ('\0' != *pt){
        arr[*pt++]++;
    }
    while ('\0' != *str){
        if (arr[*str] == 1){
            return *str;
        }
        str++;
    }
    return '\0';
}

int main(){
    char *str = "abcddefba";
    printf("%c\n", firstSingle(str));

    system("pause");
    return 0;
}


题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
 
例如输入字符串"345",则输出整数345。

分析:
可以直接使用atoi函数, 但这个题目显然不希望你这么做

我们还是按照常规方法来做,比如整数字符串长度为n= strlen(str)。
最右边的为个数,往左依次是十位,百位等。
右边---左边
0   1   2 ...
比如说个数是a0, 十位为a1, 百位为a2等等, 结果为:

实现如下:

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;

int ATOI(const char* str)
{
        int len = strlen(str);
        if(len == 0)
                return 0;
        int i = len -1;
        int j = 0;
        int res = 0;
        while(i >= 0)
        {
                res += (int(str[i]) - 48)*pow(10, j);
                j ++;
                i --;
        }
        return res;
}

int main()
{
        cout << "\"345345\": " << ATOI("345345") << endl;
        return 0;
}

其他


扫描二维码关注公众号,回复: 1504001 查看本文章

题目:输入一个整数,求该整数的二进制表达中有多少个1。

int BitCount(unsigned int n)
{
    unsigned int c =0 ; // 计数器
    while (n >0)
    {
        if((n &1) ==1) // 当前位是1
            ++c ; // 计数器加1
        n >>=1 ; // 移位
    }
    return c ;
}


猜你喜欢

转载自blog.csdn.net/kc58236582/article/details/78406821